2013-04-18 5 views
4

при решении теста на http://cppquiz.org я нашел этот интересный кусок кода:Является ли эта короткая программа легальной C++?

#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++ или оно не? Я обеспокоен строгим псевдонимом.

+6

Вы попробовали запустить его? (Я действительно не уверен, что вы считаете незаконным, - тот факт, что вы дважды передаете один аргумент функции?) –

+1

Да, это законно. Почему бы и нет? –

+2

AFAIK, это законно; это неразумно, но это законно. –

ответ

7

Вы упомянули строгий псевдоним - но strict aliasing is concerned with aliases of different types. Здесь это не применимо.

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

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

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

+0

красивый пример с деревом. :) – NoSenseEtAl

1

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

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

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

+0

Нет, там * есть * aliasing. Ссылка (фактически, указатель) является псевдонимом. –

+0

@ KonradRudolph: Ты потерял меня в «ссылке (на самом деле, указателе)». Здесь нет указателей. –

+0

@ KonradRudolph: Кроме того, я не могу найти ничего в стандарте, который ссылается на ссылки или указатели как на «псевдоним». Пожалуйста, помогите мне в моем поиске. –

 Смежные вопросы

  • Нет связанных вопросов^_^