使用模板时Constexpr函数不是constexpr

时间:2019-02-02 21:55:24

标签: c++ templates constexpr

以下代码可以正常编译:

# Renormalize if don't sum to 1
if weights.sum() != 1:
    if weights.sum() != 0:
        weights = weights / weights.sum()
    else:
        raise ValueError("Invalid weights: weights sum to zero")

但是,如果我们向struct A { int i; constexpr A() : i(1) { } constexpr A(const A& that) : i(1) { } }; constexpr auto func() { std::array<A, 3> result = {}; return result; } 添加模板类型参数T,则

A

编译器错误“ constexpr函数'func'无法导致常量表达式”。

这怎么可能?

1 个答案:

答案 0 :(得分:2)

是,MSVC有(或仍然具有)一些问题的C ++十七分之十四特征的实现,这显然也适用于constexpr。但是,在Visual Studio 2017 15.9中,以下修改对我有用(而OP中的版本也给出了错误):

template<typename T> struct A {
    int i;
    constexpr A() : i(1) { }
    constexpr A(const A<T>& that) : i(1) { }
};
constexpr auto func() {
    return std::array<A<int>, 3>{};
}