c++11 - 调用基类constexpr方法时VS2015内部编译器错误

标签 c++11 c++14 constexpr visual-studio-2015

以下代码产生内部编译器错误(VS2015)

struct A
{
    constexpr A(){}
    constexpr int bar()
    {
        return 3;
    }
};

struct B : A
{
    constexpr B(){}
    constexpr int foo()
    {
        return A::bar();
    }
};

int main()
{
    constexpr B b;
    constexpr int dummy = b.foo();
    return 1;
}

但是,如果我删除 A::限定符:

constexpr int foo()
{
    return bar();
}

它将被编译。 当这些方法具有相同的名称时就会出现问题,我需要调用基类方法。 (例如,当使用递归模板继承时)

有什么解决方法吗?

最佳答案

实际问题是 b 被声明为 const(constexpr 暗示对象上的 const)而你是尝试调用非 const(自 C++14 起,constexpr 并不意味着方法上的 const,参见 here)方法const 对象...

根据标准,您应该无法通过简单地删除 A::static_cast 来解决问题。 Visual Studio 2015 的预 RTM 版本允许您执行此操作,只是因为它对 constexpr 的支持是初步的并且非常有问题。 C++11 constexpr(但不幸的是不是 C++14 扩展 constexpr)预计将在 VS 2015 的 RTM 版本中得到完全支持(参见 here)。

您的代码的正确版本是:

struct A
{
    constexpr A(){}
    constexpr int bar() const
    {
        return 3;
    }
};

struct B : A
{
    constexpr B(){}
    constexpr int foo() const
    {
        return A::bar();
    }
};

int main()
{
    constexpr B b;
    constexpr int dummy = b.foo();
    return 1;
}

关于c++11 - 调用基类constexpr方法时VS2015内部编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30139718/

相关文章:

具有字符串和 shared_ptr union 的 C++11 类

c++ - 为什么我的 std::unordered_map 访问时间不是常量

c++ - 将参数转发给模板成员函数

c++ - constexpr 递归函数是否使用 if constexpr

C++11 在 std::is_same 之后调用类型的构造函数以确认其类型

c++ - 标准容器封装和基于范围的 for 循环

c++ - C++语法和编译器错误-运算符<<不匹配

c++ - constexpr 是否暗示内联?

c++ - 为什么在这种情况下它不是 constexpr ?

c++ - 编译器无法推断出可变参数模板的模板参数