constexpr和虚拟

b1s*_*sub 8 c++ c++11

我一直在想为什么constexrvirtual互相排斥,有人补充道:

... constexpr是关于编译时的执行; 如果我们在编译时执行该函数,我们显然也知道它在编译时所处理的数据类型,因此后期绑定显然不相关.

但是,即使在编译时,动态类型也可能与静态类型不同,并且可能存在需要动态类型的情况:

class A {
public:
    /* virtual */ constexpr int foo() {
        return 1;
    }
};

class B : public A {
public:
    constexpr int foo() {
        return 2;
    }
};

constexpr int foo(A &a) {
    // The static type is fixed here.
    // What if we want to call B::foo() ?
    return a.foo();
}

int main() {
    B b;
    constexpr int c = foo(b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

也就是说,我的问题是

  • 标准禁止两者结合的(可能的)理由是什么?

Cás*_*nan 5

此限制自constexprC++11 中引入以来就存在:

10.1.5constexpr说明符 [dcl.constexpr]

3 constexpr 函数的定义应满足以下要求:
(3.1) - 它不应是虚拟的;


但是你问的是这个限制的理由,而不是限制本身。

事实是,这可能只是一个疏忽。由于在常量表达式中需要知道对象的动态类型,因此这种限制是不必要的和人为的:这是 Peter Dimov 和 Vassil Vassilev 在P1064R0 中断言的内容,他们建议将其删除。

事实上,目前的草案中已经没有了它的措辞。