Из различных постов я понимаю, что следующее не должно компилироваться.
#include <type_traits>
#include <iostream>
template <bool is_constant> struct A {
// Need to fix this for g++-4.7.2
// implicit conversion to int iff is_constant == true statically
template <class = typename std::enable_if<is_constant>::type>
constexpr operator int() const {
return 10;
}
};
int main()
{
A<true> a;
int i = 2 + a;
std::cout << i << "\n";
A<false> b;
// int i = 2 + a; // compilation error
}
Тем не менее, Clang 3.2 принимает эту версию кода и работает нормально. Насколько я понимаю, он использует внутреннюю версию enable_if_c под капотом.
Теперь я хочу иметь эту компиляцию под gcc, которая не принимает его.
Я понимаю, что было бы хорошо иметь фактический тип и использовать SFINAE, как и в других сообщениях.
В моем случае:
У меня есть выход?
почему бы не использовать специализацию?
#include <iostream>
template <bool is_constant>
struct A {};
template <>
struct A<true> {
constexpr operator int() const {
return 10;
}
};
int main()
{
A<true> a;
int i = 2 + a;
std::cout << i << "\n";
A<false> b;
// int ii = 2 + b; // compilation error
}
это довольно прямой и кросс-компиляторный подход …
Других решений пока нет …