строгий псевдоним. Является ли эта короткая программа законной C ++?

при решении теста на http://cppquiz.org Я нашел этот интересный кусок кода:

#include <iostream>

int f(int& a, int& b) {
a = 3;
b = 4;
return a + b;
}

int main () {
int a = 1;
int b = 2;
int c = f(a, a);// note a,a
std::cout << a << b << c;
}

Мой вопрос, является ли эта программа легальной C ++ или нет? Меня беспокоит строгий псевдоним.

4

Решение

Вы упоминаете строгий псевдоним — но строгое алиасинг касается псевдонимов разных типов. Это не относится здесь.

Нет правила, запрещающего этот код. Это моральный эквивалент следующего кода:

int x = 42;
int& y = x;
int& z = x;

Или, что более важно, это эквивалентно тому, что несколько дочерних узлов ссылаются на один и тот же родительский узел в древовидной структуре данных.

7

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

Да, это законно.

Я мог бы формально доказывать это только цитируя большую часть стандартного текста C ++.

Вы передаете две ссылки, каждая из которых ссылается на один и тот же объект, что совершенно нормально. Затем вы назначаете новые значения этому единственному объекту, в свою очередь. Тоже все в порядке.

1

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