构造对象时 c++ 中的括号和大括号有什么区别
What's the difference between parentheses and braces in c++ when constructing objects
构造对象时()
和{}
有什么区别?
我认为{}只能支持initializer_list
或一个数组,但是当我在snip下运行时,我感到困惑。
#include <iostream>
using namespace std;
struct S {
int v=0;
S(int l) : v(l) {
}
};
int main()
{
S s1(12); // statement1
S s2{12}; // statement2
cout << s1.v << endl;
cout << s2.v << endl;
}
statement1
是正确的,因为 ()
是构造对象的基本语法。
我预计statement2
将被编译为失败。我认为{}
仅可用于数组或initializer_list
类型。但是实际结果完美地编译而没有错误。
我误会了什么?
对于S
,它们具有相同的效果。两者都调用构造函数S::S(int)
初始化对象。
S s2{12};
被重新为列表初始化(因为C 11(;S
不是聚合类型,而不是std::initializer_list
,也没有std::initializer_list
的构造函数,然后没有
如果上一个阶段不产生匹配项,则
T
的所有构造函数都参与过载分辨率,该分辨率与由Brad-Init-list元素组成的一组参数,并受到限制,仅允许使用非核心转换。
你以为
我认为
{}
仅可用于数组或initializer_list
类型。
这是不正确的。列表定位的效果是,例如如果S
是一种聚合类型,则执行聚合初始化;如果S
是std::initializer_list
的专业化,则将其初始化为std::initializer_list
;如果S
的构造函数服用std::initializer_list
,则首选用于初始化。您可以参考链接的页面以获取更精确的详细信息。
ps:S s1(12);
执行直接初始化。
相关文章:
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::vector和llvm::SmallVector之间有什么区别?什么时候用哪一个