C++ 如何避免使用直接值初始化进行最麻烦的解析
经过阅读,我了解到以下代码也是模棱两可的C++ 如何避免使用直接值初始化进行最麻烦的解析,c++,initialization,C++,Initialization,经过阅读,我了解到以下代码也是模棱两可的 T x(); 一方面,它可以被解释为返回T对象的函数声明,另一方面,它也可以被解释为变量定义,并且对象x是 我知道我可以像下面的代码一样使用统一初始化来避免冲突 T x{}; 我还了解T是否是(C++11之前的非POD)类,并且以下默认初始化实际上等于值初始化 T x; 同时,如果不需要直接初始化,我们可以使用 然而,我认为这三种解决方案中的任何一种都有其局限性。我知道如果有一些参数,我也可以使用一对额外的括号 T x((arg)); 我想采用这
T x();
一方面,它可以被解释为返回T
对象的函数声明,另一方面,它也可以被解释为变量定义,并且对象x
是
我知道我可以像下面的代码一样使用统一初始化来避免冲突
T x{};
我还了解T
是否是(C++11之前的非POD)类,并且以下默认初始化实际上等于值初始化
T x;
同时,如果不需要直接初始化,我们可以使用
然而,我认为这三种解决方案中的任何一种都有其局限性。我知道如果有一些参数,我也可以使用一对额外的括号
T x((arg));
我想采用这个策略,但是下面的代码不起作用
T x(());
因此,我想知道是否有一些更好的直接值初始化解决方案?使用拷贝初始化并依靠c++17保证会发生拷贝省略 例如:
自动x=T()代码>-在它所属的黑暗时代留下直接的初始化代码>统一初始化的限制是什么?一个缺点(取决于您的感受)是tx{…}
将使用std::initializer\u list
构造函数(如果存在)。这意味着std::vector foo{10,0}
是{10,0}
的向量,而auto foo=std::vector(10,0)
生成{0,0,0,0,0,0,0}
@BenVoigt它仅在提供值时生效。所有类型的AFAIKT
,TX{}
将值初始化x
。最后,一种实际统一初始化对象的方法\o/@NathanOliver让我们来谈谈auto f=Foo{}代码>;)@嘘!你会引起骚乱的。
T x(());
struct Foo
{
Foo() = default;
Foo(Foo const&) = delete;
};
int main()
{
auto f = Foo();
}