여전히 C++ 11에서 const 객체를 반환해야합니까?



performance c++11 (2)

가능한 중복 :
const 객체를 반환해야합니까?
(그 질문의 원래 제목은 : int foo () 또는 const int foo ()? 내가 그것을 놓친 이유를 설명합니다.)

효과적인 C ++, 항목 3 : 가능하면 const를 사용하십시오. 특히 if (a*b = c) { 와 같은 의도하지 않은 할당을 피하기 위해 const 객체를 반환하는 것이 좋습니다. 나는 그것이 약간의 편집증 환자라는 것을 알지만, 그럼에도 불구하고 나는이 조언을 따르고있다.

Const 개체를 반환하면 C ++ 11에서 성능이 저하 될 수 있습니다.

#include <iostream>
using namespace std;

class C {
public:
    C() : v(nullptr) { }

    C& operator=(const C& other) {
        cout << "copy" << endl;
        // copy contents of v[]
        return *this;
    }

    C& operator=(C&& other) {
        cout << "move" << endl;
        v = other.v, other.v = nullptr;
        return *this;
    }

private:
    int* v;
};

const C const_is_returned() { return C(); }

C nonconst_is_returned() { return C(); }

int main(int argc, char* argv[]) {
    C c;
    c = const_is_returned();
    c = nonconst_is_returned();
    return 0;
}

인쇄 내용 :

copy
move

이동 지정을 올바르게 구현합니까? 아니면 C ++ 11에서 const 객체를 더 이상 반환하지 않아야합니까?

https://src-bin.com


Answer #1

const_is_returned 호출하여 copy constructor move constructor 하는 대신 copy constructor 하는 이유는 move 가 객체를 수정해야하므로 const 객체에 사용할 수 없기 때문입니다. 나는 const 를 사용하는 것이 어떤 경우에도 권고되지 않으며 프로그래머 판단을 받아야한다고 주장하는 경향이있다. 그렇지 않으면 당신이 보여준 것들을 얻는다. 좋은 질문.


Answer #2

으로 const 객체 반환하는 것은 틀림없이 C ++ 11 이전에도 매우 좋은 생각이었습니다. 유일한 효과는 호출자가 반환 된 객체에 대해 비 const 함수를 호출하는 것을 방지한다는 것입니다. 그러나 호출자가 객체의 복사본 을받은 경우에는별로 관련이 없습니다.

반환되는 것은 사실이지만, 상수 객체는 호출자가 잘못 사용하는 것을 방지합니다 (예 : 실수로 비교 대신 할당 지정). 호출자가 반환 된 객체를 사용하는 방법을 결정하는 것은 함수의 책임이 아닙니다. 반환 된 객체가 함수가 소유 한 구조체에 대한 참조 또는 포인터가 아닌 경우). 함수 구현자는 반환 된 객체가 비교 또는 다른 것에 사용될 것인지 여부를 알 수 없습니다.

또한 const 를 반환하면 효과적으로 이동 작업을 수행 할 수 없으므로 C ++ 11에서 문제가 더욱 심각합니다. (그래도 복사 / 이동 엘레멘트를 막을 수는 없습니다.)

물론 함수가 참조 또는 포인터를 반환 할 때 const 가 여전히 매우 유용하다는 점 (그리고 편집증을 사용하지 않음)을 지적하는 것도 중요합니다.





const