레퍼런스는 무명객체를 참조할 수 없는건가요?

dltkddyd의 이미지

string& sc=string("tomato");

식의 참조는 불가능한 것으로 컴파일시 오류가 발생합니다. 그런데 const를 맨 앞에 붙이면 또 참조가 되고요. 저 무명객체를 상수가 아닌 string로는 참조할 수 없는것인가요? 참조라는 것은 꼭 변수 내지는 이름이 있는 객체를 대입받아야 하는 것인가요?
이거 시점의 문제인 것 같은데요. 뭐 이런걸까요? const 레퍼런스는 컴파일시에 참조로 역이고 그냥 레퍼런스는 실행시에 참조로 역인다. 이런 이유 때문인지 궁금합니다.

익명 사용자의 이미지

http://blog.naver.com/muscly/60046226535

위 블로그 내용을 참조해보시면 이해가 가실 것 같습니다.
당연히 Rvalue 를 일반 레퍼런스로 참조하게 하는 것은 표준상 허용되지 않습니다.
이런 경우에는 Rvalue reference(&&) 를 이용해야 합니다.

dltkddyd의 이미지

저 질문도 사실은 Effective C++을 읽다고 떠오른 생각이었습니다. 그런데 보다 궁금한 것이 이겁니다.

#include <iostream>
#include <cstring>
using namespace std;
#include <cstdio>
class Test {
public:
	char ch;
	Test(char _ch):ch(_ch) {
		cout<<"Test(char _ch):ch(_ch)"<<endl;
	}
 
};
 
template<typename T>
class NameObject {
private:
	string& nameValue;
	T objectValue;
public:
	NameObject(string& name, const T& value):nameValue(name), objectValue(value) {	}
	string& getNameValue() {
		return nameValue;
	}
	T& getObjectValue() {
		return objectValue;
	}
 
	NameObject& operator=(const NameObject& src) {
		nameValue=src.nameValue;
		objectValue=src.objectValue;
 
	} 
 
int main() {
	string test1("echo");
 
	//NameObject<unsigned int> obj1(string("echo"), 1);
 
	NameObject<unsigned int> obj1(test1,1);
	cout<<obj1.getNameValue()<<"  "<<obj1.getObjectValue()<<endl;//
 
 
	const string& sc=string("tomato");
	cout<<sc<<endl;
	//string& ab=string("tomato");
	string& ab=test1;cout<<ab<<endl;
	cout<<test1<<endl;
 
	string test2("around");
	NameObject<unsigned int> obj2(test2,2);
	cout<<obj2.getNameValue()<<"  "<<obj2.getObjectValue()<<endl;
	obj1=obj2;//이 대입문이 궁금해요.
	cout<<obj1.getNameValue()<<"  "<<obj1.getObjectValue()<<endl;
	printf("%p    %p\n",&obj1.getNameValue()[0], &obj2.getNameValue()[0]);
 
 
 
 
};

저렇게 정의한 복사대입연산자 문제가 있겠죠? 생성자에서 애초에 값을 할당시에 모두 레퍼런스로 참조했으니 만약 동일한 string 객체 test1을 참조하는 NameObject 객체가 있다면 대입연산자에서 값이 바뀔 때 다른 그 객체 역시 값이 바뀔테니까요. 어떤 식으로 operator를 만드는 것이 좋을까요? 애초부터 생성자에서는 참조로 nameValue를 설정해버렸으니 저 레퍼를 따로 다른 공간을 참조하도록 만들수도 없는 노릇이고요. 지금 계속 고민중입니다.
고민 중에 문득 떠오른 생각입니다.
멤버에 레퍼런스를 선언하는 것은 좋은 코드가 아니지 않나요? 다른 객체와 계속 겹치는 문제가 발생하잖아요. 참고서적의 이 예문은 학습목적으로 멤버에 레퍼런스를 언급한 것 같기도 한데, 혹시라도 해서요. 실무에서 저 레퍼런스 멤버가 객체에서 정말 실용적으로 사용되는지요?

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

klara의 이미지

문제가 있고 없고는 어떤 클래스냐로 정해지는 거죠. 문법상의 문제가 없으니까요.
의도적으로 그렇게 짤 수도 있는거죠.

복사를 통해서 참조하고 있는 대상을 바꾸고 싶은거라면 참조 변수가 아닌 포인터 변수를 이용하면 됩니다.

dltkddyd의 이미지

그럼 공유하는 자원에 대해서는 레퍼런스 멤버도 괜찮겠군요.

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

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.