gpt4 book ai didi

c++ - 为什么引用上的 constexpr 函数不是 constexpr?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:43 28 4
gpt4 key购买 nike

考虑以下函数:

template <size_t S1, size_t S2>
auto concatenate(std::array<uint8_t, S1> &data1, std::array<uint8_t, S2> &data2) {
std::array<uint8_t, data1.size() + data2.size()> result;

auto iter = std::copy(data1.begin(), data1.end(), result.begin());
std::copy(data2.begin(), data2.end(), iter);

return result;
}

int main()
{
std::array<uint8_t, 1> data1{ 0x00 };
std::array<uint8_t, 1> data2{ 0xFF };

auto result = concatenate(data1, data2);
return 0;
}

当使用 clang 6.0 编译时,使用 -std=c++17,此函数无法编译,因为数组上的 size 成员函数不是 constexpr,因为它是引用。错误信息是这样的:

error: non-type template argument is not a constant expression

当参数不是引用时,代码按预期工作。

我想知道为什么会这样,因为 size() 实际上返回一个模板参数,它几乎不能再是常量了。参数是否是引用应该没有区别。

我知道我当然可以使用 S1 和 S2 模板参数,该函数只是问题的简短说明。

标准里有什么吗?我很惊讶从中得到一个编译错误。

最佳答案

因为你评估了一个引用。来自 [expr.const]/4 :

An expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine, would evaluate one of the following expressions:

  • ...
  • an id-expression that refers to a variable or data member of reference type unless the reference has a preceding initialization and either
    • it is usable in constant expressions or
    • its lifetime began within the evaluation of e;
  • ...

您的引用参数没有预先初始化,因此不能在常量表达式中使用。

在这里您可以简单地使用S1 + S2

关于c++ - 为什么引用上的 constexpr 函数不是 constexpr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54124899/

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