1

此代码无法编译。我认为这是因为 string_view 不是 LiteralType,它违反了 constexpr 函数条件(http://en.cppreference.com/w/cpp/language/constexpr):

constexpr std::size_t find_space(std::string_view sv) noexcept {
    return sv.find(' ');
}

int main() {
    const std::string_view sv("Finding first space");
    return find_space(sv);
}

但是...如果我用模板值替换它编译得很好。为什么编译器允许这样做?

template <typename STRING_VIEW>
constexpr std::size_t find_space(STRING_VIEW sv) noexcept {
    return sv.find(' ');
}

就好像编译器忽略了 constexpr,或者 STRING_VIEWs 特征以某种方式合法地允许它通过。

将 GCC 7.1 与 -O3 -std=c++1z 一起使用。https://godbolt.org/g/z89Myb上的沙盒代码

非常感谢,亚历克斯

4

0 回答 0