constexpr string_view 比较

Posted

技术标签:

【中文标题】constexpr string_view 比较【英文标题】:Constexpr string_view comparison 【发布时间】:2018-04-11 13:28:13 【问题描述】:

我有a small program 可以在GCC 上编译,但不能在MSVC 上编译,哪个编译器没有遵循constexpr string_view 比较的标准?

#include <iostream>
#include <string_view>

int main(int argc, char **argv) 
    const constexpr auto a = "z";
    const constexpr std::string_view test("z",1);
    const constexpr std::string_view test2(a,1);
    if constexpr(test == test2) 
        return 5;
    
    else
        return 2;
    

【问题讨论】:

您使用的是哪个版本的 MSVS?你得到什么错误? 显然它只能与 GCC 7.3 一起编译,而不能与早期版本一起编译。 我不熟悉 MSVC 版本控制,但从 Compiler Explorer 看来该版本不支持 if constexpr。 This 页面详细介绍了 C++17 功能,并说“可以使用 /std:c++17 版本开关启用这些功能。”如果我在 Compiler Explorer 上添加该开关,它会告诉我这是一个未知选项。您是否尝试过使用最新的 MSVC 在本地运行它? 【参考方案1】:

C++17 constexpr if 语句are supported since MSVC 19.11。

我们可以在错误信息中看到 Compiler Explorer 当前使用的是 19.10.25017 版本。

【讨论】:

从 if 语句中删除 constexpr 并制作 constexpr bool 并不能解决它,但是 godbolt.org/g/JhwL2W @Bomaz MSVS 的字符串比较实现中似乎存在一个错误。你应该举报。 @NathanOliver developercommunity.visualstudio.com/content/problem/232218/…

以上是关于constexpr string_view 比较的主要内容,如果未能解决你的问题,请参考以下文章

在 constexpr 中连接 string_views

任何用 constexpr string_view 替换全局 const char[] 的陷阱?

为啥这个 std::string_view 不是常量表达式?

std::string_view 编译时散列

如何从预处理器#if 指令调用 constexpr 函数?

c++17比较string_view和string时的歧义