gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:29:17 27 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() 实际上返回了一个模板参数,它几乎不再是 const 了。参数是否是引用不应该有所作为。

我知道我当然可以使用 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/62966418/

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