C ++ 이중 주소 연산자? (&&)


137

STL 소스 코드를 읽고 있는데 &&주소 연산자가 무엇을해야하는지 전혀 모른다 . 다음은 코드 예제입니다 stl_vector.h.

vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
    // NB: DR 675.
    this->clear();
    this->swap(__x); 
    return *this;
}

"주소 주소"가 의미가 있습니까? 왜 하나가 아닌 두 개의 주소 연산자가 있습니까?


2
어쩌면 그것은 참조 주소 일 수도 있습니다.
Gabe

1
@ 가베; 그것은 참조에 대한 참조가되도록 선언이므로 참조 자체를 수정할 수 없으므로 의미가 없습니다. 주소는 선언 할 때가 아니라 코드에서만 사용할 수 있습니다 (이 경우와 같은 매개 변수 또는 기타). 그래도 이런 것을 본 적이 없습니다.
falstro

5
단 하나만 있었더라도 &주소 연산자와는 관련이 없지만 __x참조 임을 나타냅니다 .
sepp2k

답변:


112

이것은 C ++ 11 코드입니다. C ++ 11에서 &&토큰은 "rvalue 참조"를 의미하는 데 사용될 수 있습니다.


174

&&C ++ 11의 새로운 기능입니다. int&& a"a"는 r- 값 참조를 의미합니다. &&일반적으로 함수의 매개 변수를 선언하는 데만 사용됩니다. 그리고 그것은 r- 값 표현 만을 취합니다. r- 값이 무엇인지 모르는 경우 간단한 설명은 메모리 주소가 없다는 것입니다. 예를 들어 숫자 6과 문자 'v'는 모두 r- 값입니다. int aa는 l- 값이지만 (a+2)r- 값입니다. 예를 들면 다음과 같습니다.

void foo(int&& a)
{
    //Some magical code...
}

int main()
{
    int b;
    foo(b); //Error. An rValue reference cannot be pointed to a lValue.
    foo(5); //Compiles with no error.
    foo(b+3); //Compiles with no error.

    int&& c = b; //Error. An rValue reference cannot be pointed to a lValue.
    int&& d = 5; //Compiles with no error.
}

유익한 정보가되기를 바랍니다.


11
내가 추가하고 싶은 유일한 예는 이것이 std :: move와 어떻게 작동하는지입니다. int&& c = std::move( b );등등에 무슨 일이 일어날 지 보여주는
Zzzach ...

2
그것은처럼 보이는 Sravani S 노골적으로 2018년 2월 15일에 TutorialsPoint 주셔서에서 표절 여기 .
Gabriel Staples

3
방금 TutorialsPoint 에게이 메시지를 보냈습니다 . 그들에 의해 표절 된 기사 는 다음과 같습니다 .
Gabriel Staples

86

&&C ++ 11의 새로운 기능으로, 함수가 RValue-Reference , 즉 파괴 될 인수에 대한 참조를 허용 함을 나타냅니다 .


@bronekk :이 메시지에 게시일이 나타 났습니까? 2010 년 12 월 28
일자

죄송합니다. 지금 삭제하십시오. 더 조심 다음 시간 : 수 있을까요
bronekk

34

다른 답변에서 언급 &&했듯이이 컨텍스트 의 토큰은 C ++ 0x (다음 C ++ 표준)에 새로 도입되었으며 "rvalue 참조"를 나타냅니다.

Rvalue 참조는 다가오는 표준에서 가장 중요한 새로운 것 중 하나입니다. 그것들은 객체에서 '이동'의미를 지원하고 함수 호출의 완벽한 전달을 허용합니다.

다소 복잡한 주제입니다. 최고의 소개 중 하나 (단순한 설명이 아님)는 Stephan T. Lavavej의 "Rvalue References : VC10의 C ++ 0x 기능, 2 부"기사입니다.

이 기사는 여전히 꽤 많이 읽었지만 가치가 있습니다. Microsoft VC ++ 블로그에 있지만 모든 정보 (또는 거의 모든 정보)는 모든 C ++ 0x 컴파일러에 적용 할 수 있습니다.


&&자체 토큰은 새로운 것이 아니다; 선언에서의 의미는 다음과 같습니다. 그러나 당신은 그것을 알고있었습니다.
aschepler

이 맥락에서 새로운 기능입니다. 그러나 C / C ++가 다른 상황에서 다른 의미를 갖도록 토큰을 과부하시키는 것은 매우 전통적입니다.
Martin York

1
@aschkleper-물론 ... 논리와 연산자는 내 마음에 들어 가지 않았습니다. 답변을 업데이트하겠습니다.
Michael Burr

5

나는 그것이 이동 연산자라고 생각합니다. operator=대입 연산자입니다 (예 :) vector x = vector y. clear()함수 호출은 메모리 누수를 방지하기 위해 벡터의 내용을 삭제하는 것처럼 같은 소리. 연산자는 새 벡터에 대한 포인터를 반환합니다.

이 방법,

std::vector<int> a(100, 10);
std::vector<int> b = a;
for(unsigned int i = 0; i < b.size(); i++)
{
    std::cout << b[i] << ' ';
}

벡터에 값을 주었지만 벡터 b에는 값이 있습니다. 의 마법입니다 operator=()!

MSDN-이동 생성자를 만드는 방법


1
다른 답변에서 아직 다루지 않은이 4 년 된 질문에 추가 한 답변은 무엇입니까?
Masked Man

5
나는 이와 같은 대답을 보지 못해서 추가하기로 결정했습니다. 오늘 바로 인터넷 검색 으로이 질문을 보았습니다.
yash101
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.