gpt4 book ai didi

c++ - 为什么 boost::optional 对于继承虚函数的类会失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:39 25 4
gpt4 key购买 nike

boost::optional<> 非常适合简单的数据类型,但一旦用于从实现接口(interface)的类继承的类,它就会在启用严格别名时失败。

例子:

#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

解决这个问题的最佳方法是什么。我非常希望启用严格别名警告。我使用的是 1.44 版本的 boost。

更新:

情况变得更糟了!!考虑以下代码:

#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 一样理解 boost::optional 仅当用某物调用时。首先是微不足道的。有什么想法吗?

最佳答案

我在 Boost 1.44.0 中尝试过该程序。这个问题的原因是不要覆盖 doToSegment。

Segment doToSegment(){};

应该添加常量:

Segment doToSegment() const {};

关于c++ - 为什么 boost::optional 对于继承虚函数的类会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6433647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com