C++ 首选std::variant中的std::string<;bool,std::string>;对于常量字符*
考虑以下准则:C++ 首选std::variant中的std::string<;bool,std::string>;对于常量字符*,c++,type-conversion,c++17,implicit-conversion,variant,C++,Type Conversion,C++17,Implicit Conversion,Variant,考虑以下准则: #include <variant> #include <string> int p(std::variant<bool, std::string> v) { return v.index(); } int main() { return p("ad"); } #包括 #包括 INTP(标准::变量v){ 返回v.index(); } int main(){ 返回p(“ad”); } 不是选择std::string,而是
#include <variant>
#include <string>
int p(std::variant<bool, std::string> v) {
return v.index();
}
int main() {
return p("ad");
}
#包括
#包括
INTP(标准::变量v){
返回v.index();
}
int main(){
返回p(“ad”);
}
不是选择std::string
,而是用包含bool
(我想要std::string
)的变量实例化p,这可以通过显式指定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");
}
#包括
#包括
INTP(标准::变量v){
返回v.index();
}
模板
int p(常量字符(&s)[N]){
返回p(std::string(s));
}
int main(){
返回p(“ad”);
}
返回1
您可以使用直接创建std::string
对象
return p("ad"s);
如果后缀不可用,则需要添加使用命名空间std::literals
,使用命名空间std::string_literals
或使用命名空间std::literals::string_literals
也就是说,我已经尝试了你的代码,并且
p(“ad”)
为我返回1这在C++20中已经修复。请参阅以了解对这种情况的讨论。它适用于数组,但不适用于const char*
:因此只要int p(const char*s){return p(std::string(s));}
。如果你这样回答,你就得到了我的选票。实际上,在“real”代码中,我使用的是QString,而且std::variant也有其他成员,但不管你的成员是谁,“ad”将用于将值初始化为std::string@bluedragonQT有一个宏,可以从字符串文本创建QString
,而不复制其数据:returnp(QStringLiteral(u“ad”)代码>是否有此功能测试宏?我在cppreference.com或C++20标准草案中找不到任何内容。\uuuuCPP\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu