gpt4 book ai didi

c++ - 三元运算符中的 Nullptr

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:21 26 4
gpt4 key购买 nike

考虑:

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 (=Visual Studio 2013) 上测试过。

最佳答案

标准 5.16 中的三元运算符规则

if the second and third operand have different types and either has(possibly cv-qualified) class type, or if both are glvalues of thesame value category and the same type except for cv-qualification, anattempt is made to convert each of those operands to the type of theother.

...

Otherwise (if E1 or E2 has a non-class type, or if they both haveclass types but the underlying classes are not the same and neither isa base class of the other): E1 can be converted to match E2 if E1 canbe implicitly converted to the type that E2 would have after applyingthe lvalue-to- rvalue (4.1), array-to-pointer (4.2), andfunction-to-pointer (4.3) standard conversions.

A 不能隐式转换为 nullptr 并且 nullptr 不能隐式转换为 A

第二个版本已编译,因为存在一些从 nullptroptional 的隐式转换。

关于c++ - 三元运算符中的 Nullptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32378016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com