簡體   English   中英

«F(5)»和«int x; F(x)»調用不同的函數?

[英]«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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM