连接不匹配的字符串在VC2015工作-如何

Concatenating mismatched string WORKS in VC2015 - How?

本文关键字:工作 如何 VC2015 不匹配 字符串 连接      更新时间:2023-10-16

当我们有以下任何一个:

auto city1 = "New "  L"Delhi";
auto city2 = L"New " "York";

任何vs2015之前版本的编译器都会抛出error:

错误C2308:连接不匹配字符串

但是使用VC2015编译器,它编译得很好,结果类型(auto扣除)是一个宽字符字符串。

我的问题是:何时以及如何使这成为可能-任何标准规范?

在c++ 03中,此行为是未定义的。

ISO 14882-2003: 2.13.4.3规定

在翻译阶段6(2.1)中,相邻的窄字符串字面值为将连接的和相邻的宽字符串字面值连接起来。如果一个窄字符串字面值标记与宽字符串字面值相邻令牌,行为是未定义的。连接字符串中的字符保持不同

不确定变更是何时引入的,但行为至少在标准草案N3242中有很好的定义。

ISO 14882-2011: 2.14.5.13规定

在翻译阶段6(2.2)中,相邻的字符串字面值被连接起来。如果两个字符串字面值具有相同的编码前缀,则结果连接的字符串字面值具有该编码前缀。如果一个字符串字面值没有编码前缀,它将被视为与另一个操作数具有相同编码前缀的字符串字面值。

因此,在您的示例中,auto被正确地推断为宽字符串字量。