gcc nullptr问题

时间:2013-04-10 09:45:46

标签: c++ gcc c++11 gcc4.7 nullptr

我正在移植现有代码以在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中的模式(我更喜欢)但我很想知道这是否是编译器中的错误,或者我是否遗漏了某些东西。

1 个答案:

答案 0 :(得分:7)

这是g ++中的错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52988

假设所有nullptr_t值都是等价的(它们是,但这并不意味着你可以忽略副作用!)g ++在类型nullptr_t的表达式中丢弃了副作用。 )

这已在4.8.0版本中修复; 4.x分支机构(4.6.4和4.7.3)上的新版本也应该有修复。