从nullptr_t转换为bool:有效与否
conversion from nullptr_t to bool: valid or not?
我用3个编译器测试了以下代码,并获得了3个不同的结果:错误,警告和确定。
- GCC(5.3(:错误:从" std :: nullptr_t"到" const thing&" 的用户定义的转换无效
- clang(3.8(:警告:nullptr常数为'bool' 的隐式转换
- MSVC(14.1(:没有错误,没有警告
哪个编译器正确?我知道这是指针类型和bool
之间的微不足道转换。但是std::nullptr_t
和bool
呢?
(最终,clang和MSVC都可以使用代码。Clang以积极的方式更加详细。(
struct Thing
{
Thing(bool) {}
};
void addThing(const Thing&){}
int main()
{
addThing(nullptr); // warning or error on this line
}
这是无效的。根据布尔转换的规则:
在包括
nullptr
在内的std::nullptr_t
类型的prvalue可以在直接定位化的情况下转换为bool
类型的prvalue。结果值是false
。
标准的引用,第7.14/1节布尔转换[CONC.BOOL]
为了直接启动,可以将
std::nullptr_t
型的prvalue转换为bool
类型的prvalue;结果值是false
。
仅允许转换进行直接限制,而不得进行复制纯化,其中包括将参数传递给函数按值的情况。例如
bool b1 = nullptr; // invalid
bool b2 {nullptr}; // valid
因此,GCC是正确的。但是clang也没有错。该标准仅要求编译器在程序不正确时"签发诊断",因此必须告诉您某些事情发生,之后它可以做任何事情。
请参阅C 标准是否指定在某些情况下,编译应在错误中失败?
相关文章:
- 写入向量<向量<bool>>
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 让bool方法返回其他整数
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 递归函数有效,但无法记忆
- 在C++中初始化向量映射的最有效方法
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 从nullptr_t转换为bool:有效与否
- 最有效的方式插入一行bool值到原始数组
- Boost.Program_Options:当<bool>指定为命令行选项时,什么是有效的命令行参数?