次のコードはで正常にコンパイルされg++ (GCC) 4.7.1 20120721
ますが、最近のビルドでは失敗しますclang version 3.2 (trunk)
。
struct Y {};
struct X {
operator const Y() const { return Y(); }
};
void f(Y&& y) {}
int main()
{
f(X());
return 0;
}
変換演算子をに変更するoperator Y() const
だけで、両方のコンパイラでコードをコンパイルできます。
この場合、実際に標準に準拠しているコンパイラはどれですか?規格はこれについて実際に何と言っていますか?
要求された逐語的なエラー:
bla.cpp:14:5: error: no viable conversion from 'X' to 'Y'
f(X());
^~~
bla.cpp:1:8: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'X' to
'const Y &' for 1st argument
struct Y {
^
bla.cpp:1:8: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'X' to
'Y &&' for 1st argument
struct Y {
^
bla.cpp:6:3: note: candidate function
operator const Y() const { return Y(); }
^
bla.cpp:10:12: note: passing argument to parameter 'y' here
void f(Y&& y) {}
^
編集:残念ながら、オーバーロードを追加することさえ
void f(const Y&) {}
それでもclangに右辺値参照のオーバーロードを選択させるので、これは、たとえば標準のコンテナーで正常にコンパイルするために使用された既存のコードを壊します。