在std :: variant中首选std :: string 对于const char *

问题描述 投票:2回答:3

请考虑以下代码-

#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来解决,但这是太多的工作😊,我尝试提供不同的方法重载,但似乎不起作用。

c++ type-conversion c++17 implicit-conversion variant
3个回答
1
投票

这样的代码:

#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
投票

此问题已在C ++ 20中修复。有关此确切情况的讨论,请参见P0608


1
投票

您可以使用string literal suffix s直接创建s对象

std::string

如果后缀不可用,则需要添加return p("ad"s); using namespace std::literalsusing namespace std::string_literals

也就是说,我已经在using namespace std::literals::string_literals上尝试过您的代码,并且Wandbox为我返回1

© www.soinside.com 2019 - 2024. All rights reserved.