下面的代码可以很好地编译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 选择右值引用重载,因此这会破坏用于编译的现有代码,例如使用标准容器。