Стандартные типы C ++, такие как int или char, имеют ctors, поэтому вы можете иметь выражения вроде:
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
}
Если ваш компилятор допускает это, то это не стандартный совместимый компилятор C ++. Вы не можете привязать временное значение к неконстантной ссылке на значение. Это правило. И то и другое лязг а также НКУ не компилируйте этот код для func2(STRUCT(65));
,
Вместо этого у вас есть альтернативы:
void func1(int&& i){}
void func1(const int& i){}
Устаревшее из C ++ 03: ссылка (lvalue) на неконстантный тип (int &i
) должен иметь возможность изменить параметр, передавая временный объект, такой как 56
не логично, потому что это не изменчиво. Ссылка на тип const (const int &i
) должен просто наблюдать значение только для чтения, а затем передавать временное значение, такое как 52
законно
В C ++ 11 вы можете ссылаться на неконстантный временный объект &&
,
Похоже, вы используете компилятор MS VC ++, в котором есть такая ошибка. 🙂 Вы должны связать временный объект с помощью константной ссылки. Например, вы можете написать
const int &ri = 10;
но ты не можешь писать
int &ri = 10;
То же самое верно для пользовательских типов.
const STRUCT &rs = STRUCT( 10 );
STRUCT &rs = STRUCT( 10 ); // the compiler shall issue an error.
В C ++ анонимный временный объект всегда является правым-значением. Чтобы принять правое значение в качестве аргумента, вы можете:
1) .void foo1 (TYPE); // передача по значению
2) .void foo2 (const TYPE &); // передача по константной ссылке
3) .void foo3 (ТИП &&); // в c ++ 11, передавая по ссылке справа
Ваши «func3» и «func4» принимают аргумент, который передается по значению, это нормально.
Тем не менее, «func1» и «func2» могут принимать только аргумент, который передается с помощью ссылки на левое значение. Поэтому неправильно передавать анонимный параметр.