在 const char* 中,std::variant<bool, std::string> 更倾向于使用 std::string。

4

考虑以下代码 -

#include <variant>
#include <string>

int p(std::variant<bool, std::string> v) {
    return v.index();
}

int main() {
    return p("ad");
}

与其选择std::string,p将实例化为包含bool的变体(我想要std::string),这可以通过明确指定std::string来修复,但是这太麻烦了,我尝试提供不同的重载但似乎无效。

3个回答

7
这个问题已在C++20中得到解决。详见P0608,其中讨论了这种情况。

这个有特性测试宏吗?我在cppreference.com或C++20标准草案中找不到任何信息。根据https://eel.is/c++draft/version.syn#header:%3cversion%3e,`__cpp_­lib_­variant`宏仍然停留在`201606L`。 - Emile Cormier

2
您可以使用字符串字面值后缀s直接创建一个std::string对象。
return p("ad"s);

如果后缀不可用,则需要添加 using namespace std::literalsusing namespace std::string_literalsusing namespace std::literals::string_literals
话虽如此,我已在 Wandbox 上尝试了您的代码,p("ad") 对我返回了 1。

实际上,在“真正”的代码中,我使用的是QString,而且std::variant还有其他成员。 - unknown.prince
但无论您的成员是什么,"ad"s 都可以用来将值初始化为 std::string。 - phuclv
1
@bluedragon QT有一个QStringLiteral()宏,可以从字符串字面量创建一个QString,而不需要复制其数据:return p(QStringLiteral(u"ad")); - Remy Lebeau

1

Such code:

#include <variant>
#include <string>

int p(std::variant<bool, std::string> v) {
    return v.index();
}

template<size_t N>
int p(const char (&s)[N]) {
    return p(std::string(s));
}

int main() {
    return p("ad");
}

返回 1


4
它适用于数组但不适用于“const char*”:https://godbolt.org/z/J3LJ6F - Ted Lyngmo
所以只需 int p(const char *s) { return p(std::string(s)); } - KamilCuk
如果你回答是那样的话,你就赢得了我的投票。 - Ted Lyngmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接