小编use*_*815的帖子

为什么for循环不是编译时表达式?

如果我想做迭代一个元组的事情,我不得不求助于疯狂的模板元编程和模板助手专业化.例如,以下程序将不起作用:

#include <iostream>
#include <tuple>
#include <utility>

constexpr auto multiple_return_values()
{
    return std::make_tuple(3, 3.14, "pi");
}

template <typename T>
constexpr void foo(T t)
{
    for (auto i = 0u; i < std::tuple_size<T>::value; ++i)
    {
        std::get<i>(t);
    }    
}

int main()
{
    constexpr auto ret = multiple_return_values();
    foo(ret);
}
Run Code Online (Sandbox Code Playgroud)

因为i不能const或我们无法实现它.但是for循环是一个可以静态计算的编译时构造.由于as-if规则,编译器可以自由地删除它,转换它,折叠它,展开它或者用它做任何他们想做的事情.但是为什么不能以constexpr方式使用循环呢?这段代码中没有任何东西需要在"运行时"完成.编译器优化就是证明.

我知道你可能会i在循环体内修改,但编译器仍然可以检测到它.例:

// ...snip...

template <typename T>
constexpr int foo(T t)
{
    /* Dead code */
    for (auto i = 0u; i < std::tuple_size<T>::value; ++i)
    {
    } …
Run Code Online (Sandbox Code Playgroud)

c++ constexpr

17
推荐指数
4
解决办法
9181
查看次数

标签 统计

c++ ×1

constexpr ×1