指定初始化器中参数列表的括号数量
number of braces for parameter list in designated initializer
我当前正在与参数列表中的大括号挣扎,即使我使用C++2a
指定的初始化器。
我有一些嵌套结构为:
#include <string>
#include <optional>
struct Base
{
std::string name;
};
struct KL: public Base
{
int p1;
int p2;
};
struct FFA: public Base
{
int pp1;
int pp2;
int pp3;
};
struct Spur
{
std::optional< KL > kl;
std::optional< FFA > ffa ;
};
struct Config
{
std::string s;
int i1;
int i2;
Spur spur;
Config(
const std::string& _s,
int _i1,
int _i2,
const Spur& _spur
): s{_s},i1{_i1},i2{_i2},spur{_spur}{}
};
class Signal
{
public:
Signal( const Config& ) {}
};
struct A { int i; };
struct B { std::string s; };
struct X { A a; B b; };
int main()
Spur s1{ .kl= {{ "XYZ", 1,2 }}}; // works! gcc+clang but clang warns "suggest braces around initialization of subobject"
Spur s2{ .kl= { "XYZ", 1,2 }} ; // fails! could not convert '{"XYZ", 1, 2}' from '<brace-enclosed initializer list>' to 'std::optional<KL>'
Spur s3{ { .kl= { "XYZ", 1,2 }}}; // works gcc! clang fails: no matching constructor for initialization of 'std::optional<KL>'
Config c1{ "ABC", 1,2 , {{ .kl=std::nullopt }}}; // works gcc, clang fails no matching constructor for initialization of 'Config'
Config c2{ "ABC", 1,2 , { .kl=std::nullopt }} ; // works for gcc and clang
Signal si1{ {"ABC", 1,2 , {{ .kl = std::nullopt }} }}; // gcc ok, clang fails: no matching constructor for initialization of 'Signal'
Signal si2{ {"CDE", 3,4 , {{ .kl = KL{ "XYZ", 1,2 } }} }}; // gcc ok, clang fails: no matching constructor for initialization of 'Signal'
Signal si3{ {"CDE", 3,4 , {{ .kl = { "XYZ", 1,2 } }} }}; // gcc ok, clang fails: no matching constructor for initialization of 'Signal'
Signal si4{ {"CDE", 3,4 , { .kl = KL{ "XYZ", 1,2 } } }}; // clang & gcc ok
Signal si5{ {"CDE", 3,4 , { .kl = { "XYZ", 1,2 } } }}; // gcc& clang fail: no matching function for call to 'Signal::Signal(<brace-enclosed initializer list>)'
X x{ .b={"Hallo" }};
X x2{ .a={1} };
我的问题是:当我需要在初始化器列表中的参数集周围设置的另一组括号时?
我已经阅读了嵌套的括号和指定的初始化
用过的编译器: clang version 6.0.1
和g++ (GCC) 8.2.1
标志:-std=c++20
有人可以解释一下必须满足哪些规则以摆脱所有错误和警告?(Clang警告总是缺少牙套,但我找不到在哪里设置其他没有破坏GCC来编译的牙套)。很高兴得到一个可以在GCC和Clang上编译的示例。
您可以使用:
Spur s1{ .kl = {{ {"XYZ"}, 1,2 }}};
Config c1{ "ABC", 1,2 , { .kl = std::nullopt }};
Signal si1{ {"ABC", 1,2 , { .kl = std::nullopt} }};
演示
您需要{}
围绕"XYZ"
初始化基类。
(您甚至可以在const char*
构建std::string
周围再添加另一个{}
。
.kl = { { {"XYZ"}, 1,2 } }
| | |
| | v
| | Base
| v
| KL
v
optional
相关文章:
- 概念中的cv限定符需要表达式参数列表
- 在卡萨布兰卡形成编码参数的列表
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 列表参数的类型定义
- std::vector 没有重载函数的实例与参数列表匹配
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 构造函数/函数声明参数列表中的统一初始化
- 模板化检查是否存在带有参数列表的类成员函数?
- 没有函数模板的实例"max"与参数列表参数类型匹配(int、int)
- 具有泛型列表参数和委托的函数
- 海湾合作委员会拒绝列表参数的初始化
- 为什么初始化构造函数列表参数时会发生异常?
- 简单变量列表参数C++
- 具有列表参数C++11/C++14样式的求和函数
- c++初始化列表——参数来自构造函数体本身
- 一种更有效的处理循环内列表参数的方法