在添加detailed answer时,我注意到在Visual C ++抱怨时GCC没有警告以下代码。
#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版本:
但所有这三个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 ++成功编译此代码而没有任何警告/错误?这是一个错误吗?一项功能?在我身边错过配置?
答案 0 :(得分:1)
实际上你的g ++不接受从“const char *
”到“char *
”的转换,只是在您的版本std::strrchr()
上返回char*
(错误地,改为一个const char*
)。
要验证我的语句的第一部分,请尝试在GCC版本上编译以下内容,我预测所有内容都会正确发出错误:
int main()
{
const char* p = "foo";
char* q = p; // error, invalid conversion from 'const char*' to 'char*'
}
现在对于第二部分,我尝试编译以下最小代码,其实际目的是触发错误以便列出{{的>声明的重载 1}}:
std::strrchr
好吧,使用gcc 4.7.2消息显示预期的“所有非const”和“所有const”重载:
#include <cstring>
void (*p)() = &std::strrchr; // error here, with "candidates are: ..."
int main() {}
即。原型
prog.cpp:2:21: error: no matches converting function ‘strrchr’ to type ‘void (*)()’
In file included from /usr/include/c++/4.7/cstring:44:0,
from prog.cpp:1:
/usr/include/string.h:249:1: error: candidates are: char* strrchr(char*, int)
/usr/include/string.h:255:1: error: const char* strrchr(const char*, int)
但是gcc 4.3.2的消息不同:
char* strrchr( char* , int );
const char* strrchr( const char* , int ); // Question's code will use this one (-> error)
即。重载是
prog.cpp:2: error: no matches converting function 'strrchr' to type 'void (*)()'
/usr/include/string.h:171: error: candidates are: char* strrchr(const char*, int)
/usr/include/c++/4.3/cstring:118: error: char* std::strrchr(char*, int)
(第二个是C ++非const重载;但第一个是旧的 C版,而应该是C ++ const重载。)
这个版本的标题( char* strrchr( const char* , int ); // Question's code would use this one (-> no error...)
char* strrchr( char* , int );
和/或<cstring>
)似乎不正确,我怀疑它与您的标题相同。
修改:我发现了例如discussion,blog post和bug report(<string.h>
而不是strchr
,但情况相同。“ / p>