请考虑以下代码-
#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");
}
返回1
。
此问题已在C ++ 20中修复。有关此确切情况的讨论,请参见P0608。
您可以使用string literal suffix s
直接创建s
对象
std::string
如果后缀不可用,则需要添加return p("ad"s);
,using namespace std::literals
或using namespace std::string_literals
也就是说,我已经在using namespace std::literals::string_literals
上尝试过您的代码,并且Wandbox为我返回1