我认为,因为C++ 11用户定义的类型对象应该使用新{...}语法而不是旧(...)语法构造(除了构造函数重载std::initializer_list和类似参数(例如std::vector:size ctor vs 1 elem init_list ctor)).
好处是:没有狭义的隐式转换,最烦人的解析没有问题,一致性(?).我没有看到任何问题,因为我认为它们是相同的(除了给出的例子).
但他们不是.
该{}调用默认的构造函数.
......除非:
然后它看起来像是值而不是初始化对象?...即使对象已经删除了默认构造函数,{}也可以创建一个对象.这不是打败了删除的构造函数的全部目的吗?
......除非:
然后失败了call to deleted constructor.
......除非:
然后失败并丢失了字段初始值设定项.
但是,您可以使用它{value}来构造对象.
好吧也许这与第一个异常相同(值init对象)
......除非:
然后也{}不能{value}创建一个对象.
我相信我错过了一些.具有讽刺意味的是,它被称为统一初始化语法.我再说一遍:UNIFORM初始化语法.
这种疯狂是什么?
struct foo {
foo() = delete;
};
// All bellow OK (no errors, no warnings) …Run Code Online (Sandbox Code Playgroud) c++ language-lawyer aggregate-initialization list-initialization c++14