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