6

int や char などの標準 C++ 型には ctor があるため、次のような式を使用できます。

int a = int(67); // create anonymous variable and assing it to variable a
int b(13);       // initialize variable b
int(77);         // create anonymous variable

ユーザー定義型 (構造体またはクラス) も同じことができます。

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

3 に答える 3

5

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

const int &ri = 10;

しかし、あなたは書かないかもしれません

int &ri = 10;

同じことがユーザー定義型にも当てはまります。

const STRUCT &rs = STRUCT( 10 );

STRUCT &rs = STRUCT( 10 ); // the compiler shall issue an error.
于 2013-11-09T12:18:24.707 に答える
0

C++ では、匿名一時オブジェクトは常に正しい値です。正しい値を引数として受け入れるには、次のことができます。

1).void foo1(TYPE); //値渡し
2).void foo2(const TYPE &); // const 参照による受け渡し
3).void foo3(TYPE &&); //c++11 では、右値参照による受け渡し

「func3」と「func4」は、値渡しの引数を受け入れます。問題ありません。
ただし、「func1」と「func2」は左値参照で渡された引数しか受け付けないため、無名パラメータを渡すのは誤りです。

于 2013-11-09T12:42:21.070 に答える