我试图为C++模板非类型参数类型推导的问题找到解决方案,它不涉及调用f的模板参数,而是为模板参数隐式选择正确的类型。
由于constexpr应该保证一个函数只包含编译时常量,并且在编译时进行评估(至少我认为它是这样做的),我认为它可能是这个问题的解决方案。所以我想出了这个:
template <class T, T VALUE> void f() {}
//first i tried this:
template <class T> auto get_f(T t) -> decltype( &f<T,t> ) { return f<T,t>; }
//second try:
template <class T> constexpr void (&get_f( T t ))() { return f<T,t>; }
int main()
{
get_f(10)(); //gets correct f and calls it
}
第一个版本产生以下错误:
error: use of parameter 't' outside function body
这真的很令人困惑,因为在尾随返回类型的 decltype 语句中使用参数应该可以吗?
第二个版本产生以下错误:
error: invalid initialization of non-const reference of type 'void (&)()'
from an rvalue of type '<unresolved overloaded function type>'
这有点令人困惑,因为我完全符合资格f
。get_f
如果我没有constexpr
. 那么我对什么有错误的理解constexpr
,或者 GCC 的 C++0x 实现在这种情况下是否存在缺陷?
我正在使用 GCC 4.6.2