아시다시피 std::allocator<T>::construct
이전 버전의 C ++에서는 두 개의 매개 변수 만 사용합니다. 첫 번째는 생성되지 않은 원시 메모리에 대한 포인터이며, 여기서 우리는 유형의 객체를 구성하려고 T
하며, 두 번째는 해당 객체를 초기화하기위한 요소 유형의 값입니다. 따라서 복사 생성자가 호출됩니다.
struct Foo {
Foo(int, int) { cout << "Foo(int, int)" << endl; }
/*explicit*/ Foo(int) { cout << "Foo(int)" << endl; }
Foo(const Foo&) { cout << "Foo(const Foo&)" << endl; }
};
int main(int argc, char* argv[]) {
allocator<Foo> a;
Foo* const p = a.allocate(200, NULL); // second parameter is required on C++98 but on C++11 it is optional
// Foo* const p = a.allocate(200); // works fine on C++11 but not on C++98
a.construct(p, 5, 7); // works on C++ 11 and up but not C++98
a.construct(p, 10);// works on both
a.destroy(p);
a.destroy(p + 1);
a.deallocate(p, 200);
std::cout << std::endl;
}
C ++ 98
a.construct(p, 10)
에서 복사 생성자를 호출하지만 C ++ 11 이상에서 정수를 사용하는 생성자를 호출하는 이유는 무엇입니까?생성자
Foo(int)
가explicit
이러한 호출에서 작동하는 경우에도 일부 복사 제거 최적화로 인해 C ++ 11에서 이것이 의미합니까? C ++ 11에서 작동a.construct(p, 5)
하더라도 생성자가explicit
확실하다는 것은 C ++ 98에서 작동하지 않는다는 것입니다Foo(int)
입니다explicit
.그렇다면 어떤 종류의
copy-elision
최적화 를 비활성화하여 해당 명령문을 컴파일 하면 컴파일러가 실패합니까? 감사합니다.