타입 다음의 &&는 뭔가요?

dltkddyd의 이미지

deque의 emplace 인수의 타입을 살펴보니, 다음과 같이 Args 뒤에 &&가 언급돼 있던데요.

template <class... Args>
iterator emplace (const_iterator position, Args&&... args);

타입 다음에 언급된 &는 알리아스를 의미하는 것으로 알고 있습니다. 그런데 &&는 어떤 것인가요? 별칭의 별칭이라도 되는 것인지, 도무지 그 뜻을 모르겠습니다. 이건 검색하기도 힘드네요. 그리고 여러개의 값들을 전달받을 수 있을거라 생각했는데, 하나의 전달만을 받습니다.

익명 사용자의 이미지

lvalue reference

익명 사용자의 이미지

C++11 에 추가된 Rvalue Reference 입니다. 여기서 말하는 Rvalue 는 흔히 말하는 임시객체 정도의 의미로 생각하면 됩니다.
이것이 필요한 이유는 Move Semantics 를 위해서인데, 아래와 같은 코드가 빈번하게 쓰이기 때문입니다.

ex)

class A{ A(int); };
func(A(3));

여기서 A(3) 으로 생성되는 객체는 Rvalue 입니다. 생성된 객체는 호출 후에 어디에서도 참조가 불가능하기 때문에 사라집니다.
그래서 func 내에서 해당 객체를 이용할 때는 객체를 복사하여 사용을 하게 되고, 이후 객체는 소멸이 됩니다.

하지만 매번 이렇게 복사와 소멸이 이루어지면 퍼포먼스도 저하되는 등 문제가 많기 때문에 이러한 임시 객체를
직접 받아서 주소 이동만 하여 그대로 쓸 수 있게 만든 것이 Move Semantics 이며, 이 때 Rvalue Reference 가 사용됩니다.
물론 받은 다음 주소를 대입하고 나면 그 과정에서 move() 등의 사용으로 더 이상 Rvalue Reference 가 아니게 됩니다.

dltkddyd의 이미지

&를 사용하면 안되는 것인가요? &는 임시객체를 받지 못하나요?

그리고 이렇게 언급하면 여러개의 값이 들어갈 줄 알았는데, 컴파일시 또 오류가 발생합니다.

#include <iostream>
using namespace std;
#include <deque>
 
int main() {
	deque<char> dec2;
	dec2.resize(5,0);
	dec2[0]='o';dec2[1]='p';dec2[2]='t';;
	for(size_t i=0;i<dec2.size();i++) {
		cout<<dec2[i];
	}
	cout<<endl<<endl<<endl;
	dec2.emplace(dec2.begin(),char('T'),char('a'));//1) 이런 식으로 언급할 수 있다는 말씀이시죠?
	for(size_t i=0;i<dec2.size();i++) {
		cout<<dec2[i];
	}
	cout<<endl<<dec2.size()<<endl;
}

그런데 1)에서 오류가 발생합니다.

그런데 검색하다 보니 이런 식으로는 사용해도 문제가 발생하지 않는데요. 어떤 식으로 작동하는 걸까요?

#include <deque>
#include <iostream>
using namespace std;
int main() {
	deque<Test> dec3;
	dec3.resize(5,Test('a','b','c'));
	for(size_t i=0;i<dec3.size();i++) {
		cout<<dec3[i].a<<"  "<<dec3[i].b<<"  "<<dec3[i].c<<endl;
	}
	cout<<endl<<endl<<endl;
 
	dec3.emplace(dec3.begin()+1,'d','e','f');//2) 이 부분 말입니다.
	for(size_t i=0;i<dec3.size();i++) {
		cout<<dec3[i].a<<"  "<<dec3[i].b<<"  "<<dec3[i].c<<endl;
	}
        return 0;
}

2)는 dec3.emplace(dec3.begin()+1, Test('d','e','f'));

와 같다는데요. ...은 저 임시객체를 어떻게 풀어쓰는 것인지 참 궁금합니다.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.