首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能在函数中使用constexpr值,但在此值的范围内可以这样做呢?

为什么不能在函数中使用constexpr值,但在此值的范围内可以这样做呢?
EN

Stack Overflow用户
提问于 2016-08-13 20:39:51
回答 1查看 299关注 0票数 9

我不能在函数中使用constexpr值,而不是函数的外部。

  • 我可以在定义auto ar1 = std::array<int, il.size()>();的作用域中使用il
  • 但是我不能在{ return std::array<T, il.size()>();}中使用constexpr-function il_to_array()

为什么我不能在函数中使用constexpr值,但是我可以在这个值的块范围内这样做?

http://ideone.com/5g0iRE

代码语言:javascript
复制
#include <iostream>
#include <initializer_list>
#include <array>

constexpr size_t size_to_size(size_t v) { return v; }   // 1 - OK

template<typename T>
constexpr size_t il_to_size(std::initializer_list<T> il) { return il.size(); }  // 2 - OK

// 3 - error
template<typename T>
constexpr auto il_to_array(std::initializer_list<T> il) {return std::array<T, il.size()>();}

template<size_t N>
void print_constexpr() { std::cout << N << std::endl; }

int main() {

    constexpr std::initializer_list<int> il = { 1, 2, 3 };
    print_constexpr<il.size()>();   // 0 - OK

    print_constexpr< size_to_size(il.size()) >();   // 1 - OK

    print_constexpr< il_to_size(il) >();    // 2 - OK

    auto ar1 = std::array<int, il.size()>();    // OK - body of function: il_to_array()

    //auto ar2 = il_to_array(il);   // 3 - error

    return 0;
}

例如,我们在这里看到,这个模板--无论是constexpr还是非为什么C++编译器可以将一个函数声明为constexpr,而这个函数不能是constexpr呢? --都不会失败,因为其中一个例子可能是constexpr为什么C++编译器可以将一个函数声明为constexpr,而这个函数不能是constexpr呢?

  • 可以得出这样的结论:如果这是一个模板函数,它可以是专门化的:constexpr和非constexpr
  • SFINAE的基础上,如果我们只使用constexpr-arguments,那么只实例化constexpr-instance,而非constexpr-function不能被实例化并不重要。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-13 21:22:57

函数的参数不是constexpr

constexpr函数可能是在编译时不知道的参数。

因此,无论在编译时是否知道v,下面都是有效的

代码语言:javascript
复制
constexpr size_t size_to_size(size_t v) { return v; }

但是以下函数不起作用,因为il不是constexpr,非类型模板参数需要在编译时知道:

代码语言:javascript
复制
template<typename T>
constexpr auto il_to_array(std::initializer_list<T> il) {return std::array<T, il.size()>();}

即使函数只使用编译时已知的参数调用,也是如此。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38936809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档