Re[2]: [trick] SFINAE with decltype
От: Constructor  
Дата: 25.08.14 12:00
Оценка: 6 (1)
Здравствуйте, Кодт, Вы писали:

К>К счастью, против этого есть контрмера: void. Он всегда апеллирует к определённой компилятором запятой.


Только вместо

К>decltype(foo(t), void(0), true)


или

decltype(foo(t), void(), true)

вполне достаточно писать

decltype((void)foo(t), true)

или

decltype(static_cast<void>(foo(t)), true)

Несмотря на потенциальную возможность существования у типа decltype(foo(t)) оператора operator void() неявного приведения к void, по стандарту он никогда не должен быть вызван:

[class.conv.fct] 12.3.2/1

A conversion function is never used to convert a (possibly cv-qualified) object to the (possibly cv-qualified) same object type (or a reference to it), to a (possibly cv-qualified) base class of that type (or a reference to it), or to (possibly cv-qualified) void.


И далее в тексте сноски:

These conversions are considered as standard conversions for the purposes of overload resolution (13.3.3.1, 13.3.3.1.4) and therefore initialization (8.5) and explicit casts (5.2.9). A conversion to void does not invoke any conversion function (5.2.9). Even though never directly called to perform a conversion, such conversion functions can be declared and can potentially be reached through a call to a virtual conversion function in a base class.


В обоих цитатах выделение мое.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.