如何通过直接值初始化避免最烦人的解析?

cal*_*vin 3 c++ initialization

看了Most vexing parse,明白下面的代码也有歧义

T x();
Run Code Online (Sandbox Code Playgroud)

一方面,它可以被解释为一个函数声明,它返回一个 的对象T。另一方面,它也可以解释为变量定义,对象x值初始化的

我知道我可以像下面的代码一样使用统一初始化来避免冲突:

T x{};
Run Code Online (Sandbox Code Playgroud)

我也明白 ifT是一个(C++11 之前的非POD)类,下面的默认初始化实际上等于值初始化

T x;
Run Code Online (Sandbox Code Playgroud)

同时,如果不需要直接初始化,我们可以使用复制初始化

T x = T();
Run Code Online (Sandbox Code Playgroud)

但是,我认为这三种解决方案中的任何一种都有其局限性。我知道如果有一些参数,我也可以使用额外的一对括号:

T x((arg));
Run Code Online (Sandbox Code Playgroud)

我想采用这个策略,但是下面的代码不起作用

T x(());
Run Code Online (Sandbox Code Playgroud)

是否有一些更好的直接值初始化解决方案?

Ric*_*ges 5

使用复制初始化并依赖 C++17 的保证复制省略会发生。

例如:

struct Foo
{
    Foo() = default;
    Foo(Foo const&) = delete;
};

int main()
{
    auto f = Foo();
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/g/9tbkjZ