我通过阅读各种帖子了解到以下内容不应该编译。
#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 会很好。
就我而言:
- 我正在尝试定义一个运算符,因此我不能对具有某些默认类型/值的额外参数大惊小怪-> 似乎我不能使用 SFINAE。
- 我也不能使用继承,因为我必须保留一切 constexpr。
- 由于项目要求,我不能在我的代码 (enable_if_c) 中使用任何增强功能
我有出路吗?