gpt4 book ai didi

constexpr 和返回模板函数的 C++0x 错误

转载 作者:可可西里 更新时间:2023-11-01 16:16:31 26 4
gpt4 key购买 nike

我试图找到问题的解决方案 C++ template non-type parameter type deduction ,它不涉及调用 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 实现在这种情况下存在缺陷?

我正在使用 GCC 4.6.2

最佳答案

Since constexpr should guarantee that a function only contains compile time constants, and is evaluated at compile time (at least thats what i think it does), i thought it might be the solution for this issue.

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 + 1 i 是编译时常量还是从 std::cin 中提取。

这意味着在 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 不是常量表达式(无论如何,即使您实际上只传入常量表达式),它不能' t 作为 f 的第二个模板参数出现。

(从更大的角度来看,这意味着不,您不能使用函数模板的参数推导来方便地将非类型参数传递给模板.)

关于constexpr 和返回模板函数的 C++0x 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6740671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com