为什么/如何编译?

And*_*ick 5 c++ visual-studio

MS Visual Studio 2008中的C++.警告级别4加上一系列额外警告也已启用.我希望这至少会发出警告,但更可能是编译错误?

功能声明如下:

int printfLikeFunction(
   const int               bufferLength,
   char * const            buffer,
   const char * const      format,
   ... );
Run Code Online (Sandbox Code Playgroud)

代码用法 - 有一个错字:虽然传入了outputBuffer的ARRAY_SIZE,但outputBuffer本身并不是 - 当然这不应该编译:

printfLikeFunction( ARRAY_SIZE( outputBuffer ), "Format: %s, %s", arg1, arg2 );
Run Code Online (Sandbox Code Playgroud)

显然这是错误的,并且已经犯了错误.但是编译器应该抓住它!buffer参数应该是一个char-pointer,并且它正在传递一个字符串文字,这是一个const char-pointer.这一定是个错误.(arg1和arg2也是(可能是const)char指针,所以巧合的是声明匹配,即使没有outputBuffer在正确的位置).

在运行时,此代码在尝试写入字符串文字时崩溃.毫不奇怪,我只是不明白如何允许编译.

(虽然顺便说一句,这可能是为什么sprintf_s的缓冲区和大小参数与此函数的顺序不同 - 它会使这些错误明确失败).

CB *_*ley 9

C++对字符串文字有一个特殊的漏洞,可以与前constC风格的代码兼容.尽管字符串文字是数组const char,但它们可以转换为指向非const字符的指针.

释义4.2/2 [conv.array]:'narrow'字符串文字可以转换为非指向类型指针的右值const char.仅当存在显式目标类型(例如函数参数)时才考虑转换,而不需要在需要进行右值转换的一般左值时.

此转换已弃用,但仍可用.请注意,虽然转换允许将文字转换为指向非const char类型的指针,但仍会调用未定义的行为以尝试通过此指针修改字符串文字中的任何字符.