6
#include <iostream> 
using namespace std; 

struct Y; 

struct X 
{ 
    X(const Y&) { cout << "converting constructor" << endl; } 
}; 

struct Y 
{ 
    operator X() { cout << "conversion function" << endl; } 
}; 

void f(X x) {} 

int main() 
{ 
    Y y; 
    f(y); 
} 

在上述轉換功能由我的編譯器(gcc 4.6.1)優先於轉換構造,但在標準它指出:C++ 11:在傳遞值參數初始化中轉換構造函數和轉換函數之間的歧義?

User-defined conversions are applied only where they are unambiguous

這似乎在這種情況下是不明確的。任何人都可以解釋矛盾嗎?

我會期望上面的不編譯。我也很確定幾年前,斯科特邁爾斯寫了這個具體的例子,並說它不會編譯。我錯過了什麼?

回答

5

由於X構造函數想要const參數,它傾向於操作符。如果你刪除了X構造函數中的const,那麼編譯器會抱怨不明確。如果有多個參考參數的函數,則首選具有最寬鬆的const限定的函數。

一個很好的答案here

1

這裏沒有歧義,唯一有效的轉換由轉換功能提供。
注意y不是const,你轉換構造需要const說法。

如果你的轉換構造函數帶有一個非const引用,那麼就會有一個不明確的地方。

Online Sample:

#include <iostream> 
using namespace std; 

struct Y; 

struct X 
{ 
    X(Y&) { cout << "converting constructor" << endl; } 

}; 

struct Y 
{ 
    operator X() { cout << "conversion function" << endl; } 
}; 

void f(X x) {} 

int main() 
{ 
    Y y; 
    f(y); 
    return 0; 
} 

輸出:

prog.cpp: In member function ‘Y::operator X()’:
prog.cpp:13: warning: no return statement in function returning non-void
prog.cpp: In function ‘int main()’:
prog.cpp:21: error: conversion from ‘Y’ to ‘X’ is ambiguous
prog.cpp:13: note: candidates are: Y::operator X()
prog.cpp:8: note: X::X(Y&)

+0

順便說一句,有什麼C++ 11的特定代碼sample.The代碼是即使在C++ 03有效。 – 2012-03-12 02:57:01

+0

Downvoting這個的原因是什麼?請指出原因,如果您表示您認爲自己的感覺錯誤,並且您無法想出任何邏輯/技術原因來證明downvote的理由,請考慮自己沒有資格進行downvoting。 – 2012-03-12 09:31:24

+0

對不起。我認爲我之所以低估它的原因已經在接受的答案中給出了。構造函數*可以被轉換使用。但它不是優選的。 – 2012-03-12 19:43:23