내 프로그램이 예상치 못한 방식으로 작동하는 이유를 혼란스러워했습니다. 그런 다음이 단순화 된 버전을 작성하여 "누락 된"생성자 호출이 있음을 발견했습니다.누락 된 생성자 호출
template <class T>
class A
{
public:
A() {std::cout << "default" << "\n";} // default ctor
A (const A& src) // copy ctor
{
std::cout << "copy" << "\n";
}
friend A<T> operator<<(A& a, unsigned i)
{
std::cout << "x1" << "\n";
A tmp;
std::cout << "x2" << "\n";
return tmp;
}
};
int main()
{
A<int> a1;
A<int> a2(a1 << 2);
}
내가 기대했던 어떤 출력
default
x1
default
x2
은 a1 << 2
에 의해 반환 된 r 값으로
default
x1
default
x2
copy
가 복사 ctor에의
const A&
매개 변수로 전달 될 수 있었다. 그러나 그것은 어떻게되지 않습니다. 그렇지 않으면 내가
a2
의 생성자를 호출 할 필요가 있다는 생각 때문에 그리고 그 후 적어도 나는
default
x1
default
x2
default
을 기대.
여기에 무슨 일이 일어나고 있습니까?
복사. 나는 최적화없이 컴파일해야한다고 생각한다. – Rakete1111
나는 그것에 대해 읽었지만 나에게도 여전히 3 가지 기본 호출을 사용하는 변형이 왜 그런지 설명하지 못했습니다. –
그리고 어쨌든 최적화로 컴파일하고 있지 않습니다. –