我正在移植现有代码以在 gcc 4.7.2 下编译,并遇到了一个关于 nullptr 的奇怪问题。我设法将其归结为一个简单的测试用例:
#include <stdio.h>
const char* g_marker = "Original value";
void SetMarker( const char* s )
{
g_marker = s;
}
char* Test1()
{
return SetMarker( "I was here 1" ), nullptr;
}
char* Test2()
{
SetMarker( "I was here 2" );
return nullptr;
}
char* Test3()
{
return SetMarker( "I was here 3"), (char*)NULL;
}
int main()
{
char* returnValue = Test1();
printf( "%s\n", g_marker );
}
用 g++ test.cpp -o test -std=c++0x 编译它。
我期望的输出是“我在这里 1”,但我得到“原始值”,表明从未调用过 SetMarker。
调用 Test2 或 Test3 会给出预期的输出。
我正在使用的代码使用在 Test3 中看到的模式——最初没有在 NULL 前面进行强制转换——在从 int 到 char* 的无效转换时出现错误,所以我开始将所有这些 NULL 更改为 nullptr。不幸的是,这只是行为不正确。
我可能被迫更改代码以使用 Test2 中的模式(无论如何我更喜欢),但我很想知道这是否是编译器中的错误,或者我是否遗漏了一些东西。