当前位置: 首页 > 知识库问答 >
问题:

结构化绑定到const c-数组的副本是const吗?

楚弘益
2023-03-14

考虑以下代码(演示):

#include <tuple>
#include <type_traits>

struct Ag{int i;int j;};
using  T = std::tuple<int,int>;
using  Ar = int[2];

const Ag ag {};
const T t   {};
const Ar ar {};

void bind_ag(){
    auto [i,j] = ag;
    static_assert(std::is_same_v<decltype((i)),int&>);
    }
void bind_t(){
    auto [i,j] = t;
    static_assert(std::is_same_v<decltype((i)),int&>);
    }
void bind_ar(){
    auto [i,j] = ar;
    static_assert(std::is_same_v<decltype((i)),int&>);       //For GCC
    static_assert(std::is_same_v<decltype((i)),const int&>); //For Clang (and standard?)
    }

constc-数组副本的结构化绑定由Clang声明为const,非const由GCC声明。

c-array的GCC行为与聚合或类似元组类型的GCC行为一致。

另一方面,从我对标准的阅读来看,我假设Clang遵循所写的内容。在[dcl.struct.bind]/1 e中,类型为cv A,其中A是初始化表达式的类型,cv是结构化绑定声明的cv限定符。初始化表达式ar的类型相应地为[expr.type]/1const int[2]

应该期待什么?我的意见是,叮当声遵循标准。另一方面,我觉得其意图是数组、聚合和类似元组的类型的行为是等效的。

共有1个答案

澹台景辉
2023-03-14

[dcl.struct.bind]中标准的措辞说:

如果初始化器中的赋值表达式具有数组类型A,并且不存在ref限定符,则e具有类型cvA,并且每个元素都按照初始化器的形式从赋值表达式的相应元素复制初始化或直接初始化。

我们有auto[i,j]=arar具有数组类型const int[2],本标准的措辞明确表明e具有类型const int[2]。因此,根据措辞,每个绑定都引用元素类型,即const int。叮当声在技术上是正确的。

然而,正如Richard Smith在gcc bug 80649中指出的:

我认为这是标准中的一个缺陷。数组类型的cv限定符应该被丢弃,就像任何正常的自动推断一样。

这似乎是对的。当你编写autox=y;时,你肯定会期望x不是顶级的const,但是在这里,我们仍然有这样的情况。我认为还没有核心问题,但是应该有。

 类似资料:
  • 我一直在编写一组类来允许一个简单的类似python的-函数。下面的片段(几乎)和预期的一样工作。然而,两个变量和不是。 我一直在使用gcc 7.3.0。以下是MCVE:

  • 简短版本: 我希望能够将结构转换为元组。至少是那种类型。在下面的代码中,convertToTuple函数不起作用,因为可变参数不能用于结构化绑定(据我所知)。关键是:自动 基本上,我需要的是一种将自定义结构的类型转换为元组的方法,元组包含结构中的所有类型。例如: 具体问题: 我想创建一个模板函数,它将一个类型或一个类型列表作为模板参数,并生成一个纹理列表,每个纹理包含一个项目。另一个函数可以对纹理

  • 考虑一个例子: 在这个简单的例子中,clang(输出:)和gcc(输出:)不一致。

  • 问题内容: 我最近从mysql切换到mysqli并开始使用准备好的语句。在mysql中我们做 因此,我们将整个表的数组放在一个变量中。 但是在mysqli中 所以基本上这里只有一个变量绑定到变量结果。我们如何获得与从mysql获得的变量(数组)相同的变量? PS-希望我的问题足够清楚。我知道他们的方法不多,但我希望能找到最好的方法。 PSS-我对程序方式比较满意。 问题答案: 最终,这段代码可以正

  • 原文:Structured arrays 介绍 结构化数组其实就是ndarrays,其数据类型是由组成一系列命名字段的简单数据类型组成的。 例如: >>> x = np.array([('Rex', 9, 81.0), ('Fido', 3, 27.0)], ... dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4

  • 假设我有一个类型为 是否可以像这样以嵌套的方式访问元素类型(即在Range for循环中使用时)