나는 내가 관찰하고있는 것에 대한 이유를 모호하게 알고있을 것이라고 생각하지만, 확인이나 수정과 그에 대한 설명을 원합니다.rvalue를 반환 하시겠습니까? 또는 : 복사 생성자가`return <expression>`에 호출되는 이유는 무엇입니까?
나는 다음과 같은 코드가 있습니다
return (tmp <<= shift);
다른 : 나는 C<T>::operator<<(C<T>, unsigned)
차이의 두 가지 버전을
template <class T>
class C
{
public:
C() = default;
C(const C& rhs) : mem(rhs.mem)
{
std::cerr << "copy" << "\n";
}
// does not call copy constructor twice
// friend C operator<<(C& src, unsigned shift)
// {
// std::cerr << 1 << "\n";
// C tmp(src);
// std::cerr << 2 << "\n";
// tmp <<= shift;
// std::cerr << 5 << "\n";
// return tmp;
// }
// does call copy constructor twice
friend C operator<<(C& src, unsigned shift)
{
std::cerr << 1 << "\n";
C tmp(src);
std::cerr << 2 << "\n";
return (tmp <<= shift);
}
friend C& operator<<=(C& src, unsigned shift)
{
std::cerr << 3 << "\n";
src.mem <<= shift;
std::cerr << 4 << "\n";
return src;
}
T mem;
};
int main()
{
C<int> c1;
c1 << 3;
}
이는 일이 식의 결과를 반환 변수를 반환합니다 :
return tmp
은 지금까지 나는 두 함수가 의미 상 동일 할 것이라고 생각하고 return a + 1
이 int ret = a + 1; return ret
보다 더 스타일이 될 것 같은 return (tmp <<= shift);
을 가진 사람은 단순히 더 나은 스타일합니다. 이것은 분명히 그렇지 않으며 아마도 원자 데이터 유형에만 해당됩니다. return (tmp <<= shift);
와 버전의 출력은 다음과 같습니다
1
copy
2
3
4
copy
이 같은 다른 출력 :
1
copy
2
3
4
5
는하지만, ITM에
<<=
를 호출 한 후에
tmp
을 반환하지 않습니다
return (tmp <<= shift);
그 권리를 가리키고 내 가정이다
<<=
이 호출 된 후
tmp
사본으로 새 개체를 만드시겠습니까?
복사 생성자가 호출 될 때 또는 테스트 할 경우 다른 최적화 수준으로 테스트해야합니다. 출력은 컴파일러, 컴파일러 최적화 등에 따라 완전히 다를 수 있습니다. – PaulMcKenzie