c++ - gcc nullptr 问题

标签 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 编译它。

我期望的输出是“I was here 1”,但我得到的是“Original value”,表明 SetMarker 从未被调用。

调用 Test2 或 Test3 会给出预期的输出。

我正在使用的代码使用了在 Test3 中看到的模式 - 最初没有在 NULL 前面进行强制转换 - 在从 int 到 char* 的无效转换时出错,所以我开始将所有这些 NULL 更改为 nullptr。不幸的是,它的行为并不正确。

我可能被迫更改代码以使用 Test2 中的模式(无论如何我更喜欢),但我很想知道这是否是编译器中的错误,或者我是否遗漏了什么。

最佳答案

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

g++ 在假设所有 nullptr_t 值都是等价的(它们是等价的,但这并不意味着你可以忽略副作用!)

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

关于c++ - gcc nullptr 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15922380/

相关文章:

c++ - 在成员变量中使用模板类作为模板模板参数时出错

C++ ifstream 有奇怪的段错误,具体取决于文件在磁盘上的位置

c - GCC 链接函数时没有错误

gcc - clang (LLVM) 内联汇编 - 具有无用溢出/重新加载的多重约束

c - gcc中的 '-Wextra'和 '-pedantic'有什么区别?

c++ - std::reference_wrapper 的问题

c++ - 可变参数模板中的编译时递归

c++ - SVM 支持 vector 机回归 openCv c++

c++ - 解释期中 C++ 的示例

c++ - C++11 基于范围的 for 循环如何知道数组大小?