三元运算符中的 Nullptr
Nullptr in ternary operator
考虑:
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 中的三元运算符规则
如果第二个和第三个操作数具有不同的类型,并且具有(可能符合 CV 标准(类类型,或者如果两者都是相同价值类别和相同类型,但简历资格除外,一个尝试将这些操作数中的每一个转换为其他。
。
否则(如果 E1 或 E2 具有非类类型,或者如果它们都具有类类型,但基础类不相同,也不相同另一个的基类(:如果 E1 可以转换为匹配 E2隐式转换为 E2 在应用后将具有的类型左值到右值 (4.1(、数组到指针 (4.2( 和函数到指针 (4.3( 标准转换。
A
不能隐式转换为nullptr
,nullptr
也不能隐式转换为A
。
编译了第二个版本,因为有一些从nullptr
到optional
的隐式转换。
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 如何在自删除后将对象设置为nullptr
- 如何取消对nullptr的屏蔽,返回正确的对象
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- C++ - "!pointer"和"pointer == nullptr"的区别?
- 将指针设置为"nullptr"并不能防止双重删除?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 运算符重载 new 时 void * nullptr 使程序崩溃
- c++是否需要在用户定义和类特定的删除运算符中处理nullptr
- 三元运算符中的 Nullptr