相关疑难解决方法(0)

复制初始化和直接初始化之间有区别吗?

假设我有这个功能:

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)

在每个分组中,这些陈述是否相同?或者在某些初始化中是否有额外的(可能是可优化的)副本?

我见过有人说过这两件事.请引用文字作为证据.还请添加其他案例.

c++ initialization

230
推荐指数
5
解决办法
5万
查看次数

保证副本省略如何运作?

在2016年奥卢ISO C++标准会议上,标准委员会将一项名为" 保证副本省略"的提案通过简化的价值类别投票进入C++ 17.

保证副本省略如何运作?是否涵盖了某些已经允许复制省略的情况,或者是否需要更改代码来保证复制省略?

c++ copy-elision c++17

75
推荐指数
1
解决办法
7883
查看次数

为什么在特殊成员函数中将 r 值绑定到 const 左值引用是非法的?

对于函数参数,可以将 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)

c++ rvalue language-lawyer c++11 c++17

8
推荐指数
1
解决办法
225
查看次数

std :: atomic中的自定义类型

我把一个自定义类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)

但是,我得到了同样的错误.我不确定我能成为什么样的人.我不确定编译器指的是哪个删除的函数.

任何帮助,将不胜感激

c++ constructor atomic copy-constructor stdatomic

2
推荐指数
1
解决办法
262
查看次数