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


19

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에서 작동합니까?


어떤 컴파일러 / 표준 라이브러리 / 플랫폼을 사용하십니까?
빅터 구빈

@VictorGubin Linux (Wandbox)에서 Clang 및 GCC로 시도했습니다. 다른 버전을 시도했습니다.
Thomas Sablik

1
MCVE를 구조체 생성자 대신 로컬 인 main(또는 모든 함수, 필요하지 않음)으로 단순화 할 수 있습니다 main. 연타는 삭제 된 사용하려고하는 것이 더 명시되고, 유사한 오류 메시지를 제공 복사 : 대신 초기화 또는 일반 생성자의 생성자 godbolt.org/z/SBGf9w 의 libc와 ++
피터 코르

@PeterCordes이 오류가 클래스 초기화와 관련이 있는지 확실하지 않습니다.
Thomas Sablik

3
더 간단한 최소한의 재현 가능한 예제에 대해 동일한 오류 메시지를 얻는 것이 그렇지 않다는 것을 증명합니다. 시도하기 전까지는 확실하지 않았습니다.
Peter Cordes

답변:


29

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 };
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.