我正在尝试使用此演示代码来在 g++13 中使用
std::ranges::views::cartesian_product
。我想知道 for
中的 main
循环:
#include <cstdio>
#include <tuple>
#include <array>
#include <iostream>
#include <ranges>
typedef std::tuple<int const&, int const&, int const&> int_triple;
void print(int_triple x){
std::cout << std::get<0>(x) << " " <<std::get<1>(x) << " "<<std::get<2>(x) << " " << std::endl;
}
int main(void){
std::array<int, 2> x = {1,2};
std::array<int, 2> y = {3,4};
std::array<int, 2> z = {5, 6};
for(const int_triple& t: std::views::cartesian_product(x,y,z)){
print(t);
}
return 0;
}
为什么这样可以:
for(const int_triple& t: std::views::cartesian_product(x,y,z))
但这会引发以下错误:
for(int_triple& t: std::views::cartesian_product(x,y,z))
cartprod_demo.cpp:16:59: error: cannot bind non-const lvalue reference of type ‘int_triple&’ {aka ‘std::tuple<const int&, const int&, const int&>&’} to an rvalue of type ‘int_triple’ {aka ‘std::tuple<const int&, const int&, const int&>’}
16 | for(int_triple& t: std::views::cartesian_product(x,y,z)){
| ^
In file included from cartprod_demo.cpp:2:
/usr/include/c++/13/tuple:930:9: note: after user-defined conversion: ‘constexpr std::tuple< <template-parameter-1-1> >::tuple(std::tuple<_Args1 ...>&&) [with _UElements = {int&, int&, int&}; bool _Valid = true; typename std::enable_if<_TCC<_Valid>::__is_implicitly_constructible<_UElements ...>(), bool>::type <anonymous> = true; _Elements = {const int&, const int&, const int&}]’
如何读取此错误?
我是 C++ 新手,所以我想了解这种简洁的语法。我知道
lvalue
只是左侧的变量 t
,但这几乎就是我能从中得到的全部内容。
cartesian_product()
返回一个视图,然后 for
循环使用该视图的 iterator
来访问视图的元素。
for
循环取消引用那些迭代器来访问视图的各个元素并将它们分配给您的t
变量。 这些元素是按值返回的,因此它们是右值。
const 引用可以绑定到右值,这就是 const int_triple& t
有效的原因,但非常量引用不能,这就是
int_triple& t
失败的原因。