Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将括号内的初始值设定项列表作为结构返回_C++_Gcc_Clang - Fatal编程技术网

C++ 将括号内的初始值设定项列表作为结构返回

C++ 将括号内的初始值设定项列表作为结构返回,c++,gcc,clang,C++,Gcc,Clang,下面给出用g++-c test.cpp或g++-std=c++17-c test.cpp #include <cstddef> struct sd_bus_vtable { union { struct { size_t element_size; } start; struct {

下面给出用
g++-c test.cpp
g++-std=c++17-c test.cpp

#include <cstddef>

struct sd_bus_vtable {
        union {
                struct {
                        size_t element_size;
                } start;
                struct {
                        const char *member;
                        const char *signature;
                } signal;
        } x;
};

sd_bus_vtable get()
{
    return {
        .x = {
            .signal = {
                .member = "",
                .signature= "",
            }
        }
    };
}

问题是,上述代码是否有效?如果是,它是否触发了GCC中固定的一些错误,即GC9?

< P>指定的初始化器语法不是标准C++。它计划包含在C++20中,但尚未最终确定或发布

因此,您依赖于支持这个即将推出的特性的编译器作为扩展

在发布的C++标准中,除了第一个成员之外,没有办法为联盟成员提供这样的初始化程序。(在类定义中可以有默认的成员初始值设定项)

同时,以下代码将起作用:

sd_bus_vtable get()
{
    sd_bus_vtable r{};
    r.x.signal = {"", ""};
    return r;    
}
注意:此方法(使用赋值运算符切换联合的活动成员)仅在所有联合成员都具有普通构造函数和析构函数时有效。否则,您需要手动销毁和创建


此外,还可以省略名称
x
(这称为匿名联合),然后可以访问联合成员的名称,就像它们是封闭结构的成员一样。

实际上我使用了
-std=c++17
,结果是一样的。那么,返回这样一个结构的首选语法是什么呢?@Mine添加了一个示例C++20草稿上周已经定稿。我认为现在只需通过投票/批准流程,从我所知,这似乎被视为一种形式。@walnut N4849之后还有另一个吗?@M.M我认为编辑后会有另一个,包括上周的更改。这些议案仍然是悬而未决的问题。
sd_bus_vtable get()
{
    struct sd_bus_vtable t = {
        .x = {
            .signal = {
                .member = "",
                .signature= "",
            }
        }
    };
    return t;
}
sd_bus_vtable get()
{
    sd_bus_vtable r{};
    r.x.signal = {"", ""};
    return r;    
}