【问题标题】:What does &(int) { 1 } mean in C++?&(int) { 1 } 在 C++ 中是什么意思?
【发布时间】:2015-10-18 09:57:37
【问题描述】:

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

&(int) { 1 }

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

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

auto a = &(int) { 1 };

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

【问题讨论】:

  • 这是从哪里来的任何上下文?它本身不是compile...
  • 看起来像compound literal,但如果没有更多上下文则不确定,更可能是 C 代码,因为它在 C++ 中作为扩展支持,并且获取它的地址可能是个坏主意,因为语义不同。
  • @awesomeyi 我不记得了。在谷歌上找到的代码无论如何都不能编译是很常见的
  • @awesomeyi 可以在this hot question from CR找到!
  • @Schism 虽然这似乎是 OP 似乎在该站点上没有帐户,所以如果 OP 可以确认确实是这种情况将会很有帮助。

标签: c++ c99


【解决方案1】:

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

ISO C99 支持复合文字。复合文字看起来像包含初始化程序的强制转换。它的值是强制转换中指定类型的对象,包含初始化器中指定的元素;它是一个左值。作为扩展,GCC 支持 C90 模式和 C++ 中的复合文字,尽管 C++ 中的语义有些不同。

通常,指定的类型是结构。假设 struct foo 和 结构声明如下:

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

这里是一个使用复合构造 struct foo 的例子 字面意思:

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

这相当于写如下:

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

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

在 C 中,复合文字指定具有静态或自动存储持续时间的未命名对象。在 C++ 中,复合字面量表示一个临时对象,该对象只存在到其完整表达式的末尾。

因此在 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 有一个非常有趣的(取决于你对有趣的定义)复合文字的使用。

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

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

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

【讨论】:

    【解决方案2】:

    这不是很明显,但是如果您查看周围的代码,就会清楚它的用途和用途。

    它获取包含单个匿名整数的临时匿名结构的地址,该整数通过 C99 指定的初始化程序进行初始化。原因是setsockopt 不想要一个整数,而是一个指向它的指针(或者更确切地说,一个指向 something 的指针,以及 something 的大小)。

    换句话说,向需要指针的函数提供一种整数参数(没有显式临时变量)是一种非常酷的技巧。

    所以,它在功能上等同于:

    int blah = 1;
    setsockopt(..., &blah, ...);
    

    ... 除非它在不引入 blah 的情况下工作。

    【讨论】:

    • 我对假设引用与 OP 所指的引用是相同的有点谨慎... Schism 在评论中暗示了它的来源,但 OP 尚未证实这一点。该链接是由另一个用户而不是 OP 添加的。
    • @ShafikYaghmour:啊,我没有注意到评论不是来自 OP,我以为是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多