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

时间:2015-08-04 12:17:20

标签: c++ c++11 visual-studio-2015 c++14

当我们有这些时:

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

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

  

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

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

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

1 个答案:

答案 0 :(得分: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被正确推断为宽字符串文字。