我刚才看了钱德勒对锵介绍,在融入本土2012他提出了下面的代码:默认构造函数,POD的初始化和隐式类型转换在C++ 11
#include <iostream>
struct S{ int n; };
struct X{ X(int) {}; };
void f(void*)
{
std::cerr << "Pointer!\n";
}
void f(X)
{
std::cerr << "X!\n";
}
int main()
{
f(S().n);
}
钱德勒指出,这要求f(void*)
为C++ 11和f(X)
为c + + 03。 他还指出,原因是S(),N为默认初始化为0,使其成为一个nullptr
不变。
首先是吗在假定零初始化构件变量n的是编译器实现相关的,并且通过标准不能保证(或做了与C++ 11这种变化)?钱德勒暗示这是由于支持常量表达式,但我仍然不能完全遵循他的推理。
其次为什么会f(X)
可以用C++ 03,而不是C++ 11叫什么名字?我的假设f(void*)
会踢不管S().n
价值超过隐式转换为X
对于钱德勒的说明,请参见下面的链接,在45分钟内:
Clang: Defending C++ from Murphy's Million Monkeys
您是否知道缺陷报告是否已在此提交?我没有看到,但我可能错过了它。 – bames53 2012-03-01 17:04:22
谢谢,我永远不会写这样的代码,只是在观看钱德勒的演示文稿后感兴趣... – mark 2012-03-01 17:38:03
啊NVM我现在看到用“int”表示“你的意思是一个int变量”。我很困惑,并认为你的意思是说“0”不是int,或者int表达式永远不能是空指针常量。 – 2012-03-01 20:35:42