相关疑难解决方法(0)

什么时候constexpr函数在编译时得到评估?

由于在运行时可能会调用声明为constexpr的函数,编译器在哪个条件下决定是在编译时还是在运行时计算它?

template<typename base_t, typename expo_t>
constexpr base_t POW(base_t base, expo_t expo)
{
    return (expo != 0 )? base * POW(base, expo -1) : 1;
}

int main(int argc, char** argv)
{
    int i = 0;
    std::cin >> i;

    std::cout << POW(i, 2) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我在编译时是未知的,这可能是编译器将POW()视为在运行时调用的常规函数​​的原因.然而,这种动态虽然看起来很方便,但却具有一些不切实际的含义.例如,是否有一种情况我希望编译器在编译时计算constexpr函数,编译器决定将其视为普通函数,而它在编译时也会工作?有任何已知的常见陷阱吗?

c++ runtime compile-time constexpr c++11

58
推荐指数
2
解决办法
1万
查看次数

为什么我不能在函数中使用constexpr值,但我可以在此值的范围内执行相同的操作?

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

  • 我可以auto ar1 = std::array<int, il.size()>();il定义的范围内使用.

  • 但我不能使用{ return std::array<T, il.size()>();}in constexpr-functionil_to_array()

为什么我不能在函数中使用constexpr值,但我可以在此值的块范围内执行相同的操作?

http://ideone.com/5g0iRE

#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() { …
Run Code Online (Sandbox Code Playgroud)

c++ compile-time constexpr c++11 c++14

9
推荐指数
1
解决办法
250
查看次数

标签 统计

c++ ×2

c++11 ×2

compile-time ×2

constexpr ×2

c++14 ×1

runtime ×1