C++中的bool类型到string类型的隐式转换

4
我有下面这段代码,可在Visual C++ 2012中编译通过。
#include <string>

void func(std::string str)
{
}

void my_func()
{
    func(false);
}

布尔值“false”隐式传递到字符串构造函数中。
string(const char* _Ptr)

然后指针为null(因为false = 0)。为什么这个可以编译,根据C++11标准,它应该可以编译吗?


那不应该编译。 - chris
只有字面上的 0 可以是空指针常量。这确实不应该编译。 - Quentin
有趣的是,如果你传递'true',它就无法编译。 - Simmovation
令人惊讶的是,GCC 也编译它,但不是没有警告地进行。它会喷出“warning: converting 'false' to pointer type for argument 1 of [...] [-Wconversion-null]” 的警告信息。 - Quentin
你可以在这里看到GCC编译和运行它的结果[http://coliru.stacked-crooked.com/a/14dfdab429858113]和[https://ideone.com/1LSv8U]。 - NathanOliver
1个回答

6
MSVC错误地将false视为空指针常量。然而,根据N4140,§4.10 [conv.ptr]/1(我强调):
空指针常量是具有值为零的 整数字面值或类型为 std::nullptr_t 的 prvalue。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可与对象指针或函数指针类型的每个其他值区分开来。
措辞从C++11变化了一些,您可以在这里找到讨论。那里的结论是,这也是C++11中的错误。
为了让人们更容易理解,TartanLlama在下面提供了“整数字面值”的定义,根据[lex.icon]/1:
整数字面值是不带小数点或指数部分的数字序列,可以选择使用单引号进行分隔,在确定其值时会被忽略。

我认为你是错的,因为bool是一种整型(§3.9.1/7)。 - Konrad Rudolph
@KonradRudolph bool 是一种整型,但 false 不是一个整数字面量。 - TartanLlama
@TartanLlama 怎么了?它是一个整数,是一个字面量,其值为0。 - Konrad Rudolph
1
@KonradRudolph [lex.icon]/1 "整数字面值是一系列没有小数点或指数部分的数字,可以使用单引号进行可选的分隔,但在确定其值时会被忽略。" - TartanLlama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接