Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 首选std::variant中的std::string<;bool,std::string>;对于常量字符*_C++_Type Conversion_C++17_Implicit Conversion_Variant - Fatal编程技术网

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