при решении теста на 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 ++ или нет? Меня беспокоит строгий псевдоним.
Вы упоминаете строгий псевдоним — но строгое алиасинг касается псевдонимов разных типов. Это не относится здесь.
Нет правила, запрещающего этот код. Это моральный эквивалент следующего кода:
int x = 42;
int& y = x;
int& z = x;
Или, что более важно, это эквивалентно тому, что несколько дочерних узлов ссылаются на один и тот же родительский узел в древовидной структуре данных.
Да, это законно.
Я мог бы формально доказывать это только цитируя большую часть стандартного текста C ++.
Вы передаете две ссылки, каждая из которых ссылается на один и тот же объект, что совершенно нормально. Затем вы назначаете новые значения этому единственному объекту, в свою очередь. Тоже все в порядке.