gpt4 book ai didi

c++ - &(int) { 1 } 在 C++ 中是什么意思?

转载 作者:IT老高 更新时间:2023-10-28 12:45:36 27 4
gpt4 key购买 nike

我看到了 here我不知道这是什么意思:

&(int) { 1 }

我觉得这很奇怪,因为它看起来像是无效的语法。它正在转换一个 block 范围(?),中间有一个随机的 1(没有分号)并获取地址。对我来说没有多大意义。各位大神能指教一下吗?

使用 C++11 进行了尝试,因此可以编译:

auto a = &(int) { 1 };

但我不知道如何处理这个变量。

最佳答案

据我所知,这是 compound literal , 是 C99 特征,是 not standard C++但 gcc 和 clang 都支持它作为扩展:

ISO C99 supports compound literals. A compound literal looks like a cast containing an initializer. Its value is an object of the type specified in the cast, containing the elements specified in the initializer; it is an lvalue. As an extension, GCC supports compound literals in C90 mode and in C++, though the semantics are somewhat different in C++.

Usually, the specified type is a structure. Assume that struct foo and structure are declared as shown:

 struct foo {int a; char b[2];} structure;

Here is an example of constructing a struct foo with a compound literal:

 structure = ((struct foo) {x + y, 'a', 0});

This is equivalent to writing the following:

 {
struct foo temp = {x + y, 'a', 0};
struct

在这种情况下,a 的类型将指向 int。希望这最初是 C 代码,因为正如 gcc 文档所说:

In C, a compound literal designates an unnamed object with static or automatic storage duration. In C++, a compound literal designates a temporary object, which only lives until the end of its full-expression.

因此在 C++ 中获取地址可能是个坏主意,因为对象的生命周期在完整表达式的末尾就结束了。虽然,它可能只是依赖于未定义行为的 C++ 代码。

这是使用正确标志确实有很大帮助的情况之一,在 gcc 和 clang 中使用 -pedantic会产生警告和错误,例如 gcc 说:

warning: ISO C++ forbids compound-literals [-Wpedantic]
auto a = &(int) { 1 };
^
error: taking address of temporary [-fpermissive]

如果我们使用 -fpermissive is gcc,它确实允许此代码编译。尽管旧版本似乎允许使用 -Wno-address-of-temporary,但我无法在现代版本中使用任何标志构建此代码。我想知道 gcc 是否允许将其作为 remnant of an old extension .

注意,问题 Cryptic struct definition in C有一个非常有趣的(取决于你对有趣的定义)复合文字的使用。

假设 split is correctthis question是原始来源,然后在示例中的代码中使用:

if (setsockopt(server_connection.socket, SOL_SOCKET, SO_REUSEADDR, &(int) { 1 }, sizeof(int)) < 0) {

在 C99 和 C++ 中都是有效的用法。

关于c++ - &(int) { 1 } 在 C++ 中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31666245/

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