C++ 14 Изменена формулировка для контекстных преобразований

#include <cassert>
 
template<typename T>
class zero_init
{
    T val;
public:
    zero_init() : val(static_cast<T>(0)) { }
    zero_init(T val) : val(val) { }
    operator T&() { return val; }
    operator T() const { return val; }
};
 
int main()
{
    zero_init<int> i; assert(i == 0);
    i = 7; assert(i == 7);
    switch(i) { }     // error until C++14 (more than one conversion function)
                      // OK since C++14 (both functions convert to the same type int)
    switch(i + 0) { } // always okay (implicit conversion)
}

Есть такой код статья С++14 по адресу:

https://ru.cppreference.com/w/cpp/language/implicit_conversion#.D0.9A.D0.BE.D0.BD.D1.82.D0.B5.D0.BA.D1.81.D1.82.D0.BD.D1.8B.D0.B5_.D0.BF.D1.80.D0.B5.D0.BE.D0.B1.D1.80.D0.B0.D0.B7.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F

Почему тут до С++14 пишет ошибку?

switch(i) { }     // error until C++14 (more than one conversion function)

Что значит комментарий more than one conversion function? Что две функции конвертирования и компилятор не знает какую выбрать? Почему?

И тут не понятно почему i + 0 пишется - что бы у выражения не было адреса?

switch(i + 0) { } // always okay (implicit conversion)

Ответы (0 шт):