Standard C++, такие как межд или полукокса имеют 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
}
Ваша строка 'func2' не должна компилироваться (по той же причине, что и первая). – Mat
'void main()' является нестандартным. –
С соответствующим уровнем предупреждения вы получите 'предупреждение C4239: используется нестандартное расширение: 'argument': преобразование из 'STRUCT' в 'STRUCT &'; Неконстантная ссылка может быть привязана только к lvalue'. Вы должны использовать '/ W4'. –