在VC2015中连接不匹配的字符串WORKS - 如何?

Aja*_*jay 5 c++ c++11 c++14 visual-studio-2015

当我们有这些时:

auto city1 = "New "  L"Delhi";
auto city2 = L"New " "York";
Run Code Online (Sandbox Code Playgroud)

任何VS2015之前的编译器都会引发错误:

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

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

我的问题是:何时以及如何实现这一点 - 任何标准规范?

cto*_*tor 8

在C++ 03中,这种行为是未定义的.

ISO 14882-2003:2.13.4.3规定

在翻译阶段6(2.1)中,相邻的窄字符串文字被连接,并且相邻的宽字符串文字被连接.如果窄字符串文字标记与宽字符串文字标记相邻,则行为未定义.连接字符串中的字符保持不同.

不确定何时引入了更改,但行为至少在标准的N3242草案中已明确定义.

ISO 14882-2011:2.14.5.13声明

在翻译阶段6(2.2)中,相邻的字符串文字被连接起来.如果两个字符串文字具有相同的encoding-prefix,则生成的连接字符串文字具有该encoding-prefix.如果一个字符串文字没有编码前缀,则将其视为与另一个操作数相同的编码前缀的字符串文字.

因此,在您的情况下,auto正确推断为宽字符串文字.