此代码无法编译。我认为这是因为 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上的沙盒代码
非常感谢,亚历克斯