c++ 0x的constexpr错误,返回模板函数
C++0x error with constexpr and returning template function
我试图找到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>'
这有点令人困惑,因为我完全限定了get_f
中的f
。如果我没有constexpr
,我会期望这种错误信息。那么,我是否对constexpr
的作用有错误的理解,或者GCC的c++ 0x实现在这种情况下有缺陷?
因为constexpr应该保证函数只包含compile时间常数,并在编译时求值(至少是这样),我想这可能是解决这个问题的办法。
constexpr
函数可以在常量表达式上下文中使用,但不限于此。在这方面,它们不同于元函数和常规函数。考虑返回整数的后继值的问题:
// Regular function
int f(int i)
{ return i + 1; }
// Regular metafunction
template<int I>
struct g {
static constexpr auto value = I + 1;
};
// constexpr function
constexpr int h(int i)
{ return i + 1; }
// Then...
{
// runtime context: the metafunction can't be used
int i;
std::cin >> i;
f(i); // Okay
g<i>::value; // Invalid
h(i); // Okay
// compile time context: the regular function can't be used
char a[f(42)]; // Invalid
char b[g<42>::value]; // Okay
char c[h(42)]; // Okay
}
constexpr
有其他用法(例如构造函数),但是当涉及到constexpr
函数时,这是它的要点:一些函数应该在运行时和常量上下文中都可用,因为一些计算在两者中都可用。无论i
是编译时常数还是从std::cin
中提取,都可以计算i + 1
。
这意味着在constexpr
函数体内,参数是而不是本身的常量表达式。所以你所尝试的是不可能的。你的函数不能处理
int i;
std::cin >> i;
get_f(i); // what's the return type?
,这里发生了冲突:
constexpr auto get_f(T t)
-> decltype( &f<T,t> ) // <-
由于t
根据语言规则不是常量表达式(无论如何,即使实际上只传递常量表达式),它也不能作为f
的第二个模板形参出现。
(从更大的角度来看,这意味着不可以,您不能使用函数模板中的参数推导来方便地将非类型形参传递给类模板)
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数