Сомнительное определение common_type

В книге Николая М. Йосуттиса «Стандартная библиотека Cpp», 2-е издание, говорится (5.4, с.125), что определение структуры общего типа следующее:

template <typename T1, typename T2>
struct common_type<T1,T2> {
typedef decltype(true ? declval<T1>() : declval<T2>()) type;
};

У меня есть серьезные проблемы, чтобы поверить, что это правильное определение common_type. Причина:

typedef decltype(true ? declval<T1>() : declval<T2>()) type;//As far as I understand this will always pick second operand, declval<T1>(), due to the fact that there is 'true' value. Am I right?

3

Решение

Все дело в условном операторе. Это не утверждение выбора как будто или переключиться.

5.16 абзац стандарта ISO C ++ 11:

В противном случае, если второй и третий операнд имеют разные типы и имеют либо (возможно, cv-квалифицированный) класс
тип, или если оба являются glvalues ​​одной и той же категории значений и того же типа, за исключением квалификации cv,
делается попытка преобразовать каждый из этих операндов в тип другого.

Таким образом, не имеет значения, что decltype содержит истинное условие, компилятор должен выбрать общий тип в качестве результата.

UPD: 5.16 содержит дальнейшее описание правильного поведения, вы должны увидеть его для полного понимания всего процесса. Но для вашего конкретного вопроса:

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

4

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector