C ++ 14와 C ++ 17에서 std :: atomic 생성자가 다르게 동작하는 이유

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로 전환하면 작동합니다 : 완드 박스

차이점에 대한 cppreference를 확인했습니다.

그러나 C ++ 14와 C ++ 17에는 차이점이 없습니다. 왜 C ++ 14가 아닌 C ++ 17에서 작동합니까?



답변

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 에서 확인할 수 있습니다.

특히 섹션 (since C++17):

T x = T (T (f ())); // x를 초기화하기 위해 T의 기본 생성자를 한 번만 호출

C ++ 14 코드가 작동하도록하려면

std::atomic_int idx { 1 };