在添加详细答案时,我注意到 GCC 在 Visual C++ 抱怨时不会警告以下代码。
#include <cstring>
int main()
{
const char CONSTSTR[] = "foo/bar/foobar.txt";
char *nonconst = std::strrchr (CONSTSTR, '/');
// cannot convert from 'const char *' to 'char *'
*nonconst++ = 'B';
*nonconst++ = 'A';
*nonconst++ = 'D';
}
我测试了三个不同的 GCC 版本:
- 4.1.2 在红帽 (Linux) 上
- Cygwin (Windows) 上的 4.5.3
- 4.7.2 在 MinGW (Windows) 上
但是所有这三个 GCC 版本都编译了这段代码,没有任何警告/错误:
> g++ -Wall -Wextra -pedantic -ansi test.cpp && echo "success"
success
虽然 Microsoft 编译器 v16 抱怨:
> cl -c test.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
test.cpp
test.cpp(5) : error C2440: 'initializing' : cannot convert from 'const char *' to 'char *'
Conversion loses qualifiers
(从我的办公室,我无法访问 ideone/codepad/... 使用其他版本进行测试)
由于此代码使用std::strrchr,我不明白为什么 GCC 不抱怨。
const char* strrchr( const char* str, int ch ); //the code above uses this declaration
char* strrchr( char* str, int ch );
我的问题:为什么 g++ 成功编译此代码而没有任何警告/错误?它是一个错误吗?一个特征?我这边配置错误?