为什么string_view在作为模板类型传递时传递给constexpr函数编译?

时间:2017-07-13 23:48:22

标签: c++ constexpr c++17 string-view

此代码无法编译。我假设这是因为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

非常感谢, 亚历

0 个答案:

没有答案