为什么在 C++ 中调用基本类型的构造函数是合法的?
Why is it legal in C++ to call a constructor of a primitive type?
为什么下面的代码在C++中是合法的?
bool a(false);
我的意思是,T a(VALUE)
应该调用构造函数,对吗?我想它没有被解析为函数声明。但是 bool
是普通类型,它没有构造函数。或者是吗?
如果相关,我正在使用 Visual Studio 2012。
这与任何其他原始类型没有什么不同,例如
int a(5);
原始类型没有构造函数,你调用的是direct-initialization
这只是初始化 POD 类型的有效语法,并且具有与构造函数(甚至是复制构造函数)类似的行为。
例如,以下是有效的:
bool a(false);
bool b(a);
bool c = bool(); // initializes to false
一件有趣的事情是在
int main(int argc, const char *argv[])
{
bool f();
return 0;
}
f
是一个函数声明!
虽然 bool
是原始类型,因此没有构造函数,但语言设计者引入了适用于原始类型和 类 的统一初始化语法。这大大简化了模板代码的编写,因为您可以继续使用
T tVar(initialVal);
语法,不知道 T
,一个模板类型参数,是否是原始的。这对模板设计者来说是一个非常重要的好处,因为他们不再需要根据原始与 类.
来考虑模板类型参数。
为什么下面的代码在C++中是合法的?
bool a(false);
我的意思是,T a(VALUE)
应该调用构造函数,对吗?我想它没有被解析为函数声明。但是 bool
是普通类型,它没有构造函数。或者是吗?
如果相关,我正在使用 Visual Studio 2012。
这与任何其他原始类型没有什么不同,例如
int a(5);
原始类型没有构造函数,你调用的是direct-initialization
这只是初始化 POD 类型的有效语法,并且具有与构造函数(甚至是复制构造函数)类似的行为。
例如,以下是有效的:
bool a(false);
bool b(a);
bool c = bool(); // initializes to false
一件有趣的事情是在
int main(int argc, const char *argv[])
{
bool f();
return 0;
}
f
是一个函数声明!
虽然 bool
是原始类型,因此没有构造函数,但语言设计者引入了适用于原始类型和 类 的统一初始化语法。这大大简化了模板代码的编写,因为您可以继续使用
T tVar(initialVal);
语法,不知道 T
,一个模板类型参数,是否是原始的。这对模板设计者来说是一个非常重要的好处,因为他们不再需要根据原始与 类.