2012-06-02 61 views
5

我正在研究一个库,它有两个不同的最终用户,其中一个使用gcc 4.5.3,另一个刚搬到gcc 4.6.3。该库使用新的C++ 11智能指针(特别是unique_ptr),并在gcc 4.5.3上编译得很好。但是,在这两个版本之间,gcc开始支持nullptr,因此unique_ptr的API更改为与标准更紧密匹配。在现在这样做下面的代码从细去暧昧unique_ptr,nullptr和支持gcc 4.5.x和4.6.x

unique_ptr up(new int(30)); 
... 
if(up == 0) // ambiguous call now to unique_ptr(int) for 0 

是否有一个干净的(即,下句​​)的方式来改变上面的if语句使其作品既没有nullptr?我想,以避免可能的话

#if defined NULLPOINTER_AVAILABLE 
    #define NULLPTR (nullptr) 
#else 
    #define NULLPTR (0) 
#endif 

一个配置检查,然后宏像下面这样(我认为将工作)或这让我期待的行为的唯一途径?

回答

3

你碰到了什么错误?

#include <iostream> 
#include <memory> 
int main() { 
using namespace std; 
unique_ptr<int> up(new int(30)); 
if (up == 0) 
    cout << "nullptr!\n"; 
else cout << "bam!\n"; 
} 

g++ -std=c++0x -Wall nullptr.cpp -o nullptr(gcc 4.6.2)编译得很好。

而且,经过N2431纸通过Stroustrup的和萨特上nullptr其中类似的使用(与0比较)在实施例之一被明确列出。

+0

你是对的,你的例子工作(和我的问题陈述),所以它必须与我实际使用的类型(我没有使用“int”,而是一个模板类)有关。我会看看如果我能找到一个更好的例子,导致我所看到的,如果没有,我会标记这是正确的。 – bpw1621

+0

@ bpw1621:我确定这是与实际类型有关的事情。他们* MoveConstructible *和* MoveAssignable *?你可以用适当的'type_traits'成员来检查它,比如'is_move_constructible'。 – dirkgently

+0

如果它们是导致模糊性的类型?我确实看到了我认为的重载集合中的移动构造函数。 – bpw1621