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)
是否有一些更好的直接值初始化解决方案?
使用复制初始化并依赖 C++17 的保证复制省略会发生。
例如:
struct Foo
{
Foo() = default;
Foo(Foo const&) = delete;
};
int main()
{
auto f = Foo();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
275 次 |
| 最近记录: |