C++;从布尔到字符串的隐式转换 我有以下代码,在Visual C++ 2012中编译。 #include <string> void func(std::string str) { } void my_func() { func(false); }

C++;从布尔到字符串的隐式转换 我有以下代码,在Visual C++ 2012中编译。 #include <string> void func(std::string str) { } void my_func() { func(false); },c++,C++,然后指针为null(因为false=0)。为什么要编译,它应该按照C++11标准编译?MSVC错误地将false视为空指针常量。然而,根据N4140,§4.10[conv.ptr]/1(强调矿山): 空指针常量是值为零的整数文本 或std::nullptr\u t类型的pr值。可以使用空指针常量 转换为指针类型;结果是的空指针值 该类型和对象的其他值不同 指针或函数指针类型 从C++11开始,措辞有点变化,您可以。那里的裁决是,这也是C++11中的一个错误 为了提高可视性,TartanLlama

然后指针为null(因为false=0)。为什么要编译,它应该按照C++11标准编译?

MSVC错误地将
false
视为空指针常量。然而,根据N4140,§4.10[conv.ptr]/1(强调矿山):

空指针常量是值为零的整数文本 或std::nullptr\u t类型的pr值。可以使用空指针常量 转换为指针类型;结果是的空指针值 该类型和对象的其他值不同 指针或函数指针类型

从C++11开始,措辞有点变化,您可以。那里的裁决是,这也是C++11中的一个错误

为了提高可视性,TartanLlama根据[lex.icon]/1在下面提供了“整型文字”的定义:

整型文字是一个没有句点或指数部分的数字序列,可选的分隔单引号在确定其值时被忽略


不应编译。只有文本
0
可以是空指针常量。这确实不应该编译。有趣的是,如果您传递'true',它就不会编译。GCC也会编译它,但不会不发出警告:“警告:将[…][-Wconversion null]的参数1的'false'转换为指针类型”。您可以看到GCC编译并运行它,我相信您是错的,因为
bool
是一种整数类型(§3.9.1/7)@KonradRudolph
bool
是整数类型,但
false
不是整数文本。@TartanLlama怎么会这样?它是整数,是文本,其值为0。@KonradRudolph[lex.icon]/1整型文字是一个没有句点或指数部分的数字序列,可选的分隔单引号在确定其值时被忽略
string(const char* _Ptr)