【发布时间】:2020-11-15 13:48:32
【问题描述】:
Stroustrup C++ 第 4 版第 796 页指出“如果 Enable_if 的条件评估为假,则它所在的整个函数声明将被完全忽略。”和“......我们没有声明任何东西。”。
有谁知道为什么要声明第一个f0()?我是否正确使用了enable_if?
我的目标是禁用其中一个声明。我不确定f0() 是如何具有返回类型的,因为false 版本应该缺少::type。
#include <type_traits>
using namespace std;
template<bool B, typename T>
using Enable_if = typename std::enable_if<B,T>::type;
template <class T>
class X {
Enable_if<false, T> f0(int x) {};
Enable_if<true, T> f0(int x) {};
};
int main(void)
{
X<void> xx;
return 0;
}
编译:
clang++ -std=c++11 -Wall -pedantic test197.cc && ./a.out
test197.cc:10:24: error: functions that differ only in their return type cannot
be overloaded
Enable_if<true, T> f0(int x) {};
~~~~~~~~~~~~~~~~~~ ^
test197.cc:9:25: note: previous definition is here
Enable_if<false, T> f0(int x) {};
~~~~~~~~~~~~~~~~~~~ ^
1 error generated.
【问题讨论】:
-
SFINAE 通常要求相关声明是模板本身。在这种情况下,
f0重载都不是模板;他们是模板类型的成员是不够的。
标签: c++ templates sfinae enable-if