[英]«F(5)» and «int x; F(x)» to call different functions?
我想編寫兩個不同的函數來處理常量值和給定類型的變量(即int
)。
以下是示例測試用例:
int main(void) {
int x=12;
F(5); // this should print "constant"
F(x); // this should print "variable"
}
我認為定義是足夠的:
void F(int v) { cout << "constant\n"; }
void F(int& v) { cout << "variable\n"; }
這假設編譯器將選擇int&
for variables作為“更好的專門化”,並選擇int
作為常量的唯一選擇)。 但是, G++
就是結果:
test.cc: In function ‘int main()’:
test.cc:13: error: call of overloaded ‘F(int&)’ is ambiguous // for line: F(x);
test.cc:4: note: candidates are: void F(int)
test.cc:5: note: void F(int&)
G++
確實為常量選擇F(int)
,但不知道為變量選擇哪個函數。
有誰知道為什么會這樣?
背景 :我正在用C ++實驗類似prolog的統一方法。 能夠知道常量和變量之間的差異將有助於我在諸如functor(x,5) <=> functor(3,5)
情況下選擇所需的統一行為(賦值或比較functor(x,5) <=> functor(3,5)
。
如果你想要的是區分編譯時常量和非編譯時常量 - 那么你沒有機會。 那是不可能的。
但是,如果要區分非常量變量和常量變量(以及包含的所有其他內容 - 如文字),則可以使用const-reference和非const引用參數重載函數。 對於這種情況,C ++標准引入了額外的規則,使得這個模糊不清的情況不明確。
void f(int const&); // #1
void f(int&); // #2
在這個問題上,做了以下決定
int x = 0;
int const y = x;
int const z = 1;
f(1); // #1
f(x); // #2
f(y); // #1
f(z); // #1
注意它是如何區分y和z的,即使z的值是編譯時常量(稱為積分常量表達式,或ICE),而y則不是。
你可以做的是只接受編譯時間值即可。 重載該函數,使其中一個是模板而另一個不是
template<int N> void f(); // #1
void f(int n); // #2
它表現得像這樣:
int x = 0;
int const y = x;
int const z = 1;
f<1>(); // #1
f(1); // #2
f<y>(); // error, y not an ICE
f<z>(); // #1
f(x); // #2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.