C++ 横向协变:由于类型不完整,返回类型不同

Myo*_*yon 5 c++ covariance

我正在试验协方差并提出以下示例,该示例至少不能使用 clang 11 和 VS2015 进行编译:

class Number {
public:
    virtual ~Number () = default;
    virtual Number const * increment()const = 0;
};

class Even;

class Odd : public Number {
public:
    // error: increment() is not covariant because Even is incomplete
    Even const * increment()const; 
};

class Even : public Number {
public:
    Odd const * increment()const;
};
Run Code Online (Sandbox Code Playgroud)

它与协变返回类型、常量性和不完整类有关,但不是重复的,因为在两个被覆盖的函数中常量性是相同的。

这甚至得到标准的支持吗?

有没有办法解决这个问题或任何建议来实现类似的行为?

cig*_*ien 5

虽然可能有您想要实现的解决方法,但显示的代码无效。

根据class.virtual#9

如果 D?::?f 的协变返回类型中的类类型与 B?::?f 的不同,则 D?::?f 的返回类型中的类类型应在声明点完成D?::?f 或应为类类型 D. ...

链接文本中有此规则的示例。

在您的情况下,由于 的返回类型Odd::increment不是Number,并且Even在声明时不完整Odd::increment,因此代码格式错误。

我在这个不正确的答案中找到了答案,因此删除了@Brian 针对您链接到的问题所写的答案

  • 公平地说,你确实说过“编译器如何验证......”?所以它*可能*是可能的;)但是要回答你的问题@Kostas,考虑到当前的语言规则,实际上没有办法将检查推迟到链接时间。 (2认同)