【发布时间】:2011-06-22 00:40:08
【问题描述】:
boost::optional 适用于简单数据类型,但一旦用于从实现接口的类继承的类,当启用严格别名时它会失败。
例子:
#include <boost/optional.hpp>
struct MyLine{
double a;
double b;
};
class Edge{
public:
MyLine toMyLine() const;
private:
virtual MyLine doToMyLine() const =0;
};
class Wall:public Edge {
public:
Wall(MyLine const& seg):mMyLine(seg){};
private:
MyLine doToMyLine() const{return MyLine();};
MyLine mMyLine;
};
class SimpleWall {
public:
SimpleWall(MyLine const& seg):mMyLine(seg){};
private:
MyLine mMyLine;
};
int main(){
//boost::optional<Wall> res; //fails with strict aliasing error
boost::optional<SimpleWall> res2; //compiles just fine
}
使用 gcc 版本 4.4.3 编译,这是错误的:
g++ -c -pipe -Wall -Wextra -Wunused -Wmissing-declarations -Wpointer-arith -Wcast-align -Wwrite-strings -Wredundant-decls -Werror -std=c++0x -O2 -Wall -W -I/usr/local/boost_1_44_0 -o obj/main.o main.cpp
解决此问题的最佳方法是什么。我非常希望启用严格混叠警告。我使用的是 boost 1.44 版。
更新:
变得更糟了!!考虑以下代码:
#include <boost/optional.hpp>
class MyBase{
public:
int toFoo() const;
private:
virtual int doToFoo() const =0;
};
class Child:public MyBase {
public:
Child(int const& foo):mFoo(foo){};
private:
int doToFoo() const{return 0;}
int mFoo;
};
int main(){
boost::optional<int> optint; //comment out for surprise
optint.get(); //comment out for surprise
boost::optional<Child> res2;
res2.get();
}
使用 gcc 版本 4.4.3 编译如下:
g++ -c -pipe -Wall -Wextra -Wunused -Wmissing-declarations -Wpointer-arith -Wcast-align -Wwrite-strings -Wredundant-decls -Werror -std=c++0x -O2 -Wall -W -I/usr/local/boost_1_44_0 -o obj/main.o main.cpp
如果标有“//comment out for surprise”的行被注释掉,我会收到严格的别名警告。我已经检查了至少 20 次。这是我见过的最奇怪的事情之一。看起来 boost::optional 初始化了某事。独立于它的模板参数,或者像 gcc 一样,只有在使用 sth 调用时才能理解 boost::optional。先琐碎。有什么想法吗?
【问题讨论】:
-
既然您说的是严格别名,我们可以假设您使用的是 GCC 吗? (这是我所知道的唯一知道或关心的编译器)
-
@Martin :在做任何其他事情之前先尝试 Boost 1.46.1 或 1.47 beta;考虑到 1.44.0 现在已经快一年了,这个问题很可能已经得到修复。
-
什么是问题?这段代码是否存在“严格别名”的问题?
-
@ildjarn:也许,也许不是。 AFAIK boost 不会尝试在所有编译器上编译无警告。特别是当警告是关于标准允许的行为时。
-
@Billy :当 GCC 引入严格的别名警告时,Boost 开发人员邮件列表上发生了一场大风暴;正如您所说,许多警告都被忽略了,但特别是在消除这些警告方面付出了很多努力。
标签: c++ gcc boost gcc-warning strict-aliasing