다음 코드에서 이동 생성자 호출이 생략 된 이유는 무엇입니까?생성자 템플릿 엘레멘트 이동
struct Foo {
Foo() = default;
Foo(const Foo&) { cout << "Foo(const Foo&)" << endl; }
template<class T> Foo(T&&) { cout << "Foo<T>(T&&)" << endl; }
};
auto f = Foo{};
출력 : Foo<T>(T&&)
, 그 소리 3.3에 검사 g ++ 4.9.
기본값 또는 사용자 정의 이동 생성자 결과를 출력하지 않고 추가합니다. 왜 생성자 템플릿을 호출하는 호출이 컴파일러에 의해 생략되지 않는가? 그리고 템플릿이 아닌 템플릿에 대한 호출이 사용자 정의 (즉, 컴파일러에서 부작용이없고 안전하게 생략 할 수 있음을 알 수있는 방법)해도 제거되지 않는 이유는 무엇입니까?
다른 최적화 수준을 사용해 보셨습니까? –
아니요, 기본 플래그를 사용했지만 최적화 수준이 아니라 언어 표준의 문제인 것으로 보입니다 (최적화가 올바른 형식의 프로그램 동작을 변경하지 않아야 함). – Hertz