对于 const char *,更喜欢 std::variant<bool, std::string> 中的 std::string
Prefer std::string in std::variant<bool, std::string> for const char *
考虑以下代码 -
#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
来修复,但是工作量太大了,我尝试提供不同的重载但它似乎不起作用。
这样的代码:
#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");
}
returns 1
.
您可以使用 string literal suffix s
直接创建一个 std::string
对象
return p("ad"s);
如果后缀不可用,则需要添加 using namespace std::literals
、using namespace std::string_literals
或 using namespace std::literals::string_literals
就是说,我已经在 Wandbox 和 p("ad")
returns 上试过你的代码
1
这已在 C++20 中修复。有关此确切案例的讨论,请参阅 P0608。
考虑以下代码 -
#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
来修复,但是工作量太大了,我尝试提供不同的重载但它似乎不起作用。
这样的代码:
#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");
}
returns 1
.
您可以使用 string literal suffix s
直接创建一个 std::string
对象
return p("ad"s);
如果后缀不可用,则需要添加 using namespace std::literals
、using namespace std::string_literals
或 using namespace std::literals::string_literals
就是说,我已经在 Wandbox 和 p("ad")
returns 上试过你的代码
这已在 C++20 中修复。有关此确切案例的讨论,请参阅 P0608。