gpt4 book ai didi

c++ - =声明与定义中的默认值

转载 作者:IT老高 更新时间:2023-10-28 22:04:19 24 4
gpt4 key购买 nike

我知道,而不是写作:

class A {
public:
A(A&&) noexcept = default;
};

最好写

class A {
public:
A(A&&) noexcept;
};

inline A::A(A&&) noexcept = default;

我听说的原因是:

  1. 避免构造函数变成deleted。如果无法定义函数,编译器会报错。

  2. 移动构造函数被声明为 noexcept,即使某些成员字段的移动构造函数没有使用 noexcept 注释。

有人能详细解释一下这些差异背后的理论吗?

最佳答案

只有声明是用来描述类/方法的,所以在做的时候

class A {
public:
A(A&&) noexcept;
};

您甚至可以根据需要实现 A::A(A&&)(定义可以在不同的 TU 中)

当你实现它时:

A::A(A&&) noexcept = default;

编译器必须生成方法(它无法判断它是否被隐式删除,因为声明精确方法存在),如果不能,则提供诊断。

但是当你在类中声明它时:

class A {
public:
A(A&&) noexcept = default;
};

它是声明的“部分”。所以它可能会被隐式删除(因为成员或基类)。

同样适用于noexcept

将定义放在专用 TU 中的另一个优点是,所需依赖项的定义只能在该 TU 中,而不是在生成方法的每个地方。 (例如对 pimpl 习惯用法很有用)。

拆分定义和声明的一个缺点是该方法现在是“用户提供的”,这可能会影响特性,如 trivially_constructible/copyable/...

关于c++ - =声明与定义中的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51340720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com