Вдохновленный этот вопрос, я пробовал следующий код:
struct A {
virtual void doit() const = 0;
};
struct B : public A {
virtual void doit() const;
};
struct C : public A {
virtual void doit() const;
};
void
foo(bool p)
{
const A &a = (p ? static_cast<const A &>(B()) : static_cast<const A &>(C()));
a.doit();
}
Каждый компилятор, который я пробовал, принимает этот код с -Wall -Werror
и генерирует сборку, которую я хочу. Но после тщательного изучения раздела 12.2 ( "Временные" ) раздела С++ 03 и раздела 5.12 ( "Условный оператор" ) я не уверен, что это гарантировано.
Итак, этот допустимый код, или он вызывает поведение undefined? Отличается ли ответ для С++ 03 и С++ 11?
Приветствуются цитаты из соответствующих спецификаций.