gpt4 book ai didi

c++ - const 限定符是否会增加临时复合文字的生命周期?

转载 作者:行者123 更新时间:2023-11-27 22:56:51 25 4
gpt4 key购买 nike

GNU C++ extension implements compound literal differently form C99从某种意义上说,GNU C++ 复合文字是一个临时对象并且具有单行生命周期。

所以这段代码在尝试获取这样一个临时对象的地址时会出现编译错误:

#include <iostream>
using namespace std;
#include <valarray>

int main() {
int n = 5;
std::valarray<int> arr((int[]){1,1,2,2,3}, n);
//^^^^^ error here, although the compound literal
// outlives the constructor
for (int i = 0; i < n; ++i)
cout << arr[i] << ' ';
cout << endl;
}

但是,通过将 (int[]){1,1,2,2,3} 更改为 (const int[]){1,1,2,2,3 },此错误消失,代码 runs OK .

然后似乎通过添加 const 限定符,复合文字不再是临时的。

我知道 const 引用可以将临时对象的生命周期增加到引用的生命周期,但我不明白这与这个问题有什么关系。

所以我的问题是,C++ 标准和/或 GNU C++ 扩展是否明确定义了上述代码的行为?

最佳答案

既然是GCC扩展,肯定不能用C++标准来定义。就标准而言,该程序的格式不正确。

GNU 文档(根据您的链接)指出 const 修饰符可能会改变行为:

As an optimization, the C++ compiler sometimes gives array compound literals longer lifetimes: when the array either appears outside a function or has const-qualified type. If ‘foo’ and its initializer had elements of ‘char *const’ type rather than ‘char *’, or if ‘foo’ were a global variable, the array would have static storage duration.

但继续建议:

But it is probably safest just to avoid the use of array compound literals in code compiled as C++.

顺便说一句,从 C++11 开始,有一个 std::valarray 构造函数接受一个 initializer_list,所以以下在 C++ 中是合式的11 没有 GCC 扩展:

std::valarray<int> arr{1,1,2,2,3};

关于c++ - const 限定符是否会增加临时复合文字的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31946080/

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