2013-11-09 3 views
6

標準C++のタイプは、ctorsを持っているあなたのような表情を持つことができますので、このようなintやcharとして

struct STRUCT 
{ 
    STRUCT(int a){} 
}; 

STRUCT c = STRUCT(67); 
STRUCT d(13); 
STRUCT(77); 

質問は次のとおりです。参照匿名構造またはクラスインスタンスを渡すことはできますが、標準タイプを渡すことができないのはなぜですか?

struct STRUCT 
{ 
    STRUCT(int a){} 
}; 

void func1(int& i){} 
void func2(STRUCT& s){} 
void func3(int i){} 
void func4(STRUCT s){} 

void main() 
{ 
    //func1(int(56)); // ERROR: C2664 
    func2(STRUCT(65)); // OK: anonymous object is created then assigned to a reference 
    func3(int(46)); // OK: anonymous int is created then assigned to a parameter 
    func4(STRUCT(12)); // OK: anonymous object is created then assigned to a parameter 
} 
+4

あなた 'func2'ラインは、(最初​​のと同じ理由で)コンパイルべきではありません。 – Mat

+0

'void main()'は非標準です。 –

+0

適切な警告レベルを指定すると、警告C4239が表示されます:非標準拡張子が使用されました: '引数': 'STRUCT'から 'STRUCT'への変換;非const参照は左辺値にのみ結合することができる。 '/ W4'を使うべきです。 –

答えて

2

コンパイラがこれを許可している場合、標準互換のC++コンパイラではありません。仮の右辺値を非左辺値参照にバインドすることはできません。それはルールです。 clanggccの両方は、func2(STRUCT(65));のコードをコンパイルしません。

代わりにあなたは選択肢があります:C++ 03から

void func1(int&& i){} 

void func1(const int& i){} 

レガシー:非const型へ(左辺値)を基準(int &i)などの一時的なオブジェクトを渡し、パラメータを変更することになってし56は変更できないため論理的ではありません。読み取り専用としてだけで値を観察することになっconst型(const int &i)への参照は、そのような52として一時的な値を渡すことは合法です。

あなたが &&で非const一時的なオブジェクトへの参照できるC++ 11では

5

あなたがそのようなバグを持っているMS VC++コンパイラを使用しているようです。:)あなたはconst参照して、一時的なオブジェクトをバインドする必要があります。たとえば、あなたは

const int &ri = 10; 

を書き込むことができますが、同じユーザー定義型のために有効である

int &ri = 10; 

を書き込まないことがあります。 C++、匿名の一時的なオブジェクトで

const STRUCT &rs = STRUCT(10); 

STRUCT &rs = STRUCT(10); // the compiler shall issue an error. 
0

常にright-value.To引数として右値を受け入れ、することができますです:

1).void foo1は(TYPE); //値によって
2).void foo2は(const型&)を通過させます。 // const参照
3).void foo3(TYPE & &)を通過。 // in C++ 11、右値参照渡し

"func3"と "func4"は値渡しの引数を受け入れます。
しかし、 "func1"と "func2"は、左値参照を渡した引数だけを受け入れることができます。匿名パラメータを渡すのは間違いです。

関連する問題