考虑:
struct A { bool operator==(const A& that) { return true; } };
boost::optional<A&> f()
{
std::vector<A> vec;
auto it = std::find(vec.begin(), vec.end(), A());
// Version A
return (it == vec.end() ? nullptr : *it);
// Version B
if (it == vec.end()) {
return nullptr;
} else {
return *it;
}
}为什么版本A不编译(错误C2446:没有从'A‘到’nullptr‘的转换),而B版本呢?
)我知道我能做到。
return (it == vec.end() ? boost::optional<A&>() : *it);我的问题是:为什么nullptr的构造与三元操作符的处理方式不同?)
仅在msvc12上测试(= 2013)。
发布于 2015-09-03 14:21:53
标准5.16中的三元算子规则
如果第二个操作数和第三个操作数有不同的类型,或者具有(可能是cv限定的)类类型,或者两者都是值类别相同和类型相同(cv限定除外)的值,则尝试将每个操作数转换为另一个操作数的类型。 ..。 否则(如果E1或E2具有非类类型,或者如果它们都有类类型,但底层类不相同,也不是另一个基类):如果E1可以隐式转换为E2在应用lvalue- to - rvalue (4.1)、数组到指针(4.2)和函数- to -指针(4.3)标准转换后将具有的类型,则可以转换为匹配E2。
A不是隐式可转换为nullptr,nullptr也不是隐式可转换为A。
第二个版本是编译的,因为有一些从nullptr到optional的隐式转换。
https://stackoverflow.com/questions/32378016
复制相似问题