【问题标题】:constexpr and templates error in Visual Studio 2015Visual Studio 2015 中的 constexpr 和模板错误
【发布时间】:2015-10-08 14:15:42
【问题描述】:

我有下一个代码可以在 Visual Studio 2015 上正常编译:

class Base
{
    protected:
        constexpr Base(float value);

    private:
        float    _value;
};

constexpr Base::Base(float value)
    : _value(value)
{
}

class Derived : public Base
{
    public:
        constexpr Derived(float value)
            : Base(value)
        {
        }
};

通过将其更改为:

template<typename T>
class Base
{
    protected:
        constexpr Base(T value);

    private:
        T    _value;
};

template<typename T>
constexpr Base<T>::Base(T value)
    : _value(value)
{
}

class Derived : public Base<float>
{
    public:
        constexpr Derived(float value)
            : Base(value)
        {
        }
};

我收到以下错误:

错误 C2134: 'Base::Base': 调用不会产生常量表达式

注意:失败是由于调用了未定义的函数或未声明的 'constexpr'

注意:参见'Base::Base'的声明

通过在类中实现Base的构造函数,错误神奇地消失了:

template<typename T>
class Base
{
    protected:
        constexpr Base(T value)
            : _value(value)
        {
        }

    private:
        T    _value;
};

class Derived : public Base<float>
{
    public:
        constexpr Derived(float value)
            : Base(value)
        {
        }
};

这是编译器中的错误还是我在第二种情况下做错了什么?

编辑:所有 3 个版本都可以使用 clang 和 gcc 编译

【问题讨论】:

    标签: c++ c++11 visual-studio-2015


    【解决方案1】:

    关于 C++11 constexpr 的注释:这是一个复杂的大特性 整个核心语言的交互,在编译器中实现 代码库正在进行现代化改造,首次交付。 它包含错误/限制,其中一些您可能会注意到,还有很多 其中将在更新中修复。 (例如,编译器是 当前无法为非标量静态 constexpr 发出初始化程序 数据成员,包括字符数组。这个场景已经 被警告为错误 C4579 阻止。)尽管如此,我还是选择了 列出编译器对 C++11 constexpr 的完整支持, 因为 STL 正在成功地使用它,而且非常密集地使用它。 (STL 的少数缺少 constexpr 事件是由于 仅限库的问题,缺少魔术编译器钩子,以及 没有 C++14 扩展的 constexpr 循环。)

    从这里: http://blogs.msdn.com/b/vcblog/archive/2015/06/19/c-11-14-17-features-in-vs-2015-rtm.aspx

    可能还不支持。

    【讨论】:

      猜你喜欢
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 2016-02-26
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多