gpt4 book ai didi

c++ - 是什么阻止了这个函数接受左值?

转载 作者:行者123 更新时间:2023-12-03 07:51:21 25 4
gpt4 key购买 nike

auto&& 应该类似于模板中的 T&&,从某种意义上说,它意味着通用引用,而不是 R 值引用。但是,只有当我转换为右值时才能调用此函数。以下内容取 self 正在使用的 JSON 库:

#include <variant>

struct json_t
{
using array_t = std::vector<json_t>;
using object_t = std::map<std::string, json_t, std::less<>>;
using null_t = std::nullptr_t;
using val_t = std::variant<null_t, double, std::string, bool, array_t, object_t>;
val_t data{};


json_t& operator[](std::integral auto&& index) { return std::get<array_t>(data)[index]; }

};

int main()
{

int lvalue = 1;

json_t f;
f[1]; // WORKS
f[lvalue]; // DOESN'T WORK
f[std::move(lvalue)]; // DOES WORK
}

如果我转换为右值,它就会起作用。如果我从 [] 函数/运算符的参数签名中删除 std::integral ,它也会起作用。这里发生了什么?

我得到的错误是:

no operator "[]" matches these operands

最佳答案

当传递 int 左值时,auto 被推导为 int&,这不满足 std::integral code> 概念,因为它是引用类型,而不是整型。

使用 int 右值引用 auto 被推导为满足该概念的 int

这始终是转发引用的推导方式(这些只是转发引用的特殊规则):左值函数参数将模板参数推导为左值引用类型,而右值函数参数将其推导为非引用类型。然后使用引用折叠规则 & && -> &[nothing] && -> &&,替换后, auto&&/T&& 是左值参数的左值引用和右值参数的右值引用,这是推导所期望的。 (不过,函数类型参数有一个异常(exception)。)

你想要类似的东西

json_t& operator[](auto&& index)
requires std::integral<std::remove_reference_t<decltype(index)>>
{ return std::get<array_t>(data)[index]; }

但是由于您实际上并未在正文中转发index,因此转发引用有点毫无意义,所以只需

json_t& operator[](const std::integral auto& index)
{ return std::get<array_t>(data)[index]; }

可能没问题。

或者,考虑到只接受整型,按值传递可能也很好,并且可能具有更好的性能,因为整型通常可以在寄存器中传递,而无需额外的间接:

json_t& operator[](std::integral auto index)
{ return std::get<array_t>(data)[index]; }

关于c++ - 是什么阻止了这个函数接受左值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77062864/

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