연산자 new의 실행 순서와 생성자의 인수


9

합니까 C ++은 순서 지정 사양 operator new과의 생성자 A에를 new C(A()).
g는 순서하자 ++ A()-> new-> C()하지만, 그 소리가하자 ++ new-> A()-> C().
차이가 지정되지 않은 동작으로 인해 발생합니까?

g ++ : 7.4.0 clang ++ : 10.0.0

#include <iostream>
#include <cstdlib>

struct A {
    A() {
        std::cout << "call A()\n";
    }
};

struct C {
    C(A) {
        std::cout << "call S()\n";
    }

    void *operator new(size_t s) {
        std::cout << "call new()\n";
        return malloc(s);
    }
};

int main() {
    void *p = new C(A());
}

3
C ++ 17, C ++ 14 또는 이전 버전으로 구축하고 있습니까?
StoryTeller-Unslander Monica 2009 년

4
두 개의 메모 :이 태그에 "C"로 태그를 달았습니다.이 태그는 해당 태그의 설명을 읽지 않았 음을 분명히 보여줍니다. 하지마 이제 "정의되지 않은 행동"(UB)에 대해 질문합니다. 이것은 C ++ 표준에서 어떤 일이 발생할 수 있고 피해야 할 일을 표시하기 위해 사용하는 용어입니다. 코드가 기술적으로 훌륭하고 UB를 유발하지 않기 때문에 "지정되지 않은 동작"이 있습니다.
Ulrich Eckhardt

1
@ Ulrich Eckhardt 제안 해 주셔서 감사합니다. 나는 둘을 섞었다.
eddie kuo

답변:


11

클랭이 맞습니다. C ++ 17부터 실행 순서가 보장됩니다. [expr.new] / 19

할당 함수의 호출은 new-initializer 에서 표현식을 평가하기 전에 순서화 됩니다.

operator new(할당 함수)를 먼저 호출 한 다음 new-initializer (예 :)에서 표현식을 평가 A()합니다.

C ++ 17 이전에는 순서가 보장되지 않습니다. [expr.new] / 18 (C ++ 14)

할당 함수의 호출은 new-initializer 의 표현식 평가와 관련하여 결정적으로 순서가 지정 됩니다.


gcc가 C ++ 17 이상을 준수하지 않는 것 같습니다. C ++ 2a 모드에서 gcc10으로 컴파일 하면 동일한 결과가 나타납니다.

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