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;
}