Передача анонимной переменной по ссылке

Стандартные типы 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
}

6

Решение

Если ваш компилятор допускает это, то это не стандартный совместимый компилятор 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 вы можете ссылаться на неконстантный временный объект &&,

2

Другие решения

Похоже, вы используете компилятор MS VC ++, в котором есть такая ошибка. 🙂 Вы должны связать временный объект с помощью константной ссылки. Например, вы можете написать

const int &ri = 10;

но ты не можешь писать

int &ri = 10;

То же самое верно для пользовательских типов.

const STRUCT &rs = STRUCT( 10 );

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

В C ++ анонимный временный объект всегда является правым-значением. Чтобы принять правое значение в качестве аргумента, вы можете:

1) .void foo1 (TYPE); // передача по значению
2) .void foo2 (const TYPE &); // передача по константной ссылке
3) .void foo3 (ТИП &&); // в c ++ 11, передавая по ссылке справа

Ваши «func3» и «func4» принимают аргумент, который передается по значению, это нормально.
Тем не менее, «func1» и «func2» могут принимать только аргумент, который передается с помощью ссылки на левое значение. Поэтому неправильно передавать анонимный параметр.

0
По вопросам рекламы [email protected]