这是一个从C++ 98继承了不稳定的设计问题:某些转换或初始化被语法局限于文字,特别是字符串文字作为字符数组初始化([dcl.init.string]/1)和整数常量为空指针常量([conv.ptr]/1).当然,这与"完美"转发并不顺畅.
对于空指针,通过引入来避免该问题nullptr
,0
即使在转发之后也可以使用它来代替并且工作正常.
在您的情况下,基本上有两个主要选择:
Exploit brace elision - X
也是一个聚合:
struct X { X2 x2; } z{1, 2, "abc"}; // Ok
声明buf
具有类类型,例如std::string
,或者在您的情况下可能更适合某些静态大小的等效类型(限制为10).