是否可以使用有条件选择的字符串文字来初始化字符数组?

2024-03-04

我知道初始化一个是完全有可能的char带有字符串文字的数组:

char arr[] = "foo";

C++11 8.5.2/1 是这样说的:

A char数组(无论是普通char, signed char, or unsigned char), char16_t array, char32_t数组,或者wchar_t数组可以通过窄字符文字初始化,char16_t字符串字面量,char32_t细绳 分别是文字或宽字符串文字,或用大括号括起来的适当类型的字符串文字。 字符串文字值的连续字符初始化数组的元素。 ...

但是,你能做同样的事情吗two条件表达式中的字符串文字?例如这样:

char arr[] = MY_BOOLEAN_MACRO() ? "foo" : "bar";

(Where MY_BOOLEAN_MACRO()扩展到1 or 0).

C++11 5.16(条件运算符)的相关部分如下:

1 ...第一个表达式根据上下文转换为bool(第 4 条)。 对其进行评估,如果是true,条件表达式的结果是第二个表达式的值, 否则是第三个表达式。 ...

4 如果第二个和第三个操作数是相同值类别且具有相同类型的泛左值,则结果 属于该类型和值类别,并且如果第二个或第三个操作数是位域,或者如果 两者都是位域。

请注意,文字的长度相同,因此它们都是类型的左值const char[4].

海湾合作委员会一思想 http://ideone.com/eih2Jm接受该构造。但通过阅读该标准,我根本不确定它是否合法。有人有更好的见解吗?


另一方面clang不接受这样的代码(现场观看 http://melpon.org/wandbox/permlink/jTTGMnBzfy1t9mFV)我相信clang在这一点上是正确的(MSVC 也拒绝此代码 http://rextester.com/NQECUL1379).

A 字符串字面量由节中的语法定义2.14.5:

string-literal:
    encoding-prefixopt" s-char-sequenceopt"
    encoding-prefixoptR raw-string

本节第一段说(强调我的):

字符串文字是一个字符序列(如 2.14.3 中定义)用双引号括起来,可选地以 R、u8、u8R、u、uR 为前缀, U、UR、L 或 LR,如“...”、R“(...)”、u8“...”、u8R“(...)“, 你“...”,你“˜(...)〜"、U"..."、UR"zzz(...)zzz"、L"..." 或 LR"(...)", 分别

它进一步说明窄字符串文字的类型是:

“n 个常量字符的数组”,

也:

具有静态存储期限

but an “n 个常量字符的数组”,静态存储持续时间不是字符串字面量因为它不符合语法也不符合段落1.

我们可以让这个失败gcc如果我们使用非常量表达式 (现场观看 http://melpon.org/wandbox/permlink/gEV3ImIU5KBYa5ee):

bool x = true ;
char arr[] = x ? "foo" : "bar";

这意味着它可能是一个扩展,但它不符合标准,因为它不会在严格一致性模式 https://gcc.gnu.org/onlinedocs/gcc/Standards.html即使用-std=c++11 -pedantic。来自部分1.4 [合规简介]:

[...]需要实现来诊断使用此类的程序 根据此国际格式不正确的扩展 标准。然而,这样做之后,他们可以编译并执行这样的 程式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以使用有条件选择的字符串文字来初始化字符数组? 的相关文章

随机推荐