如何解决为什么boost :: optional对于继承虚拟函数的类失败?
| 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
如果标有“ //注释掉的惊喜”的行被注释掉,我将收到严格的别名警告。我已经检查了至少20次。这是我见过的最奇怪的事情之一。看起来像boost :: optional初始化sth。与其模板参数无关,或者像gcc一样,只有在用sth调用时才了解boost :: optional。琐碎的第一。有任何想法吗 ?
解决方法
我在Boost 1.44.0中尝试了该程序。
这个问题的原因是不要覆盖doToSegment。
Segment doToSegment(){};
应该添加const:
Segment doToSegment() const {};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。