Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何避免使用直接值初始化进行最麻烦的解析_C++_Initialization - Fatal编程技术网

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它仅在提供值时生效。所有类型的AFAIK
T
TX{}
将值初始化
x
。最后,一种实际统一初始化对象的方法\o/@NathanOliver让我们来谈谈
auto f=Foo{};)@嘘!你会引起骚乱的。
T x(());
struct Foo
{
    Foo() = default;
    Foo(Foo const&) = delete;
};

int main()
{
    auto f = Foo();
}