假设我有这个功能:
void my_test()
{
A a1 = A_factory_func();
A a2(A_factory_func());
double b1 = 0.5;
double b2(0.5);
A c1;
A c2 = A();
A c3(A());
}
Run Code Online (Sandbox Code Playgroud)
在每个分组中,这些陈述是否相同?或者在某些初始化中是否有额外的(可能是可优化的)副本?
我见过有人说过这两件事.请引用文字作为证据.还请添加其他案例.
对于函数参数,可以将 r 值绑定到 l 值常量引用。但是,这似乎不适用于特殊成员函数,如 C++11 和 C++14 中的复制构造函数和复制赋值运算符。这有什么动机吗?
使用 C++17 时,可以从 r 值复制构造,但不能复制赋值。是否有动机为什么这里只更改了复制构造函数的行为?
所有这些都在以下示例中进行了演示:
struct B {
B() = default;
B(B const&) = default;
B(B&&) = delete;
B& operator=(B const&) = default;
B& operator=(B&&) = delete;
};
void bar(B const &) {}
int main() {
bar(B{}); // does work
B(B{}); // only works in C++17
B b{};
b = B{}; // doesn't work
}
Run Code Online (Sandbox Code Playgroud) 我把一个自定义类Unit放在一个std::atomic.使用默认构造函数,类看起来如下所示
namespace Base
{
template <typename T, typename R, typename D>
class Unit
{
public:
constexpr Unit() = default;
private:
T m_Value;
};
}
Run Code Online (Sandbox Code Playgroud)
它曾经工作正常,直到我注意到我忘了在默认构造函数中将我的类的唯一成员初始化为零.因此我删除了= default并提供了构造函数的实现
template <typename T, typename R, typename D>
constexpr Unit<T, R, D>::Unit() :
m_Value(T(0))
{ }
Run Code Online (Sandbox Code Playgroud)
现在我收到编译器错误:
Error C2280 'std::atomic<Base::Unit>::atomic(void) noexcept': attempting to reference a deleted function
我的预感是因为我现在提供了一个自定义构造函数,这导致默认的复制构造函数不再被隐式定义.
所以,我也把这个添加到了类声明中
Unit(const Unit<T, R, D>& U) = default;
Run Code Online (Sandbox Code Playgroud)
但是,我得到了同样的错误.我不确定我能成为什么样的人.我不确定编译器指的是哪个删除的函数.
任何帮助,将不胜感激