gpt4 book ai didi

c++ - 为什么 std::atomic 构造函数在 C++14 和 C++17 中的行为不同

转载 作者:行者123 更新时间:2023-12-02 05:03:30 24 4
gpt4 key购买 nike

我正在使用 C++11 的项目中工作,我尝试了以下代码

#include <atomic>

struct A {
std::atomic_int idx = 1;

};

int main() {
return 0;
}

我收到编译器错误

error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]'
std::atomic_int idx = 1;
^

C++14 的结果相同。当我切换到 C++17 时,它可以工作: wandbox

我检查了 cppreference 的差异:

但是 C++14 和 C++17 之间没有任何差异记录。为什么它适用于 C++17 而不适用于 C++14?

最佳答案

因为在 C++17 中,有一个有保证的 RVO。在 C++14 中,像 Foo x = Foo(args)Foo x (args) 这样的语句在技术上并不相同,但它们在 C++17 中是不同的。

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

int main() {
// Works in C++17 and C++20, fails in C++14 and before
Foo foo = Foo();
}

您可以在这里阅读更多相关信息:https://en.cppreference.com/w/cpp/language/copy_elision

特别是(C++17 起) 部分:

T x = T(T(f())); // only one call to default constructor of T, to initialize x

要使 C++14 代码正常工作,您可以使用

std::atomic_int idx { 1 };

关于c++ - 为什么 std::atomic 构造函数在 C++14 和 C++17 中的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59196970/

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