gpt4 book ai didi

c++ - boost::variant 与 bool 和 string

转载 作者:行者123 更新时间:2023-12-02 10:27:47 24 4
gpt4 key购买 nike

我遇到了 boost::variant 的问题(使用 boost 1.67.0)。

当我的模板参数列表同时包含 boolstd::string ,任何应该被视为字符串的变体对象,似乎都被隐式绑定(bind)到 bool 。例如:

using Varval = boost::variant<bool, std::string>;

void main()
{
std::vector<Varval> vect{ true, false, "Hello_World" };

std::cout << "[ ";
for (const auto &v : vect)
std::cout << v << " ";
std::cout << "]\n";
}

输出:

[ 1 0 1 ]



而如果我只更改第一个模板参数,从 boolint ,它工作正常:
using Varval = boost::variant<int, std::string>;

void main()
{
std::vector<Varval> vect{ true, false, "Hello_World" };

std::cout << "[ ";
for (const auto &v : vect)
std::cout << v << " ";
std::cout << "]\n";
}

正确输出:

[ 1 0 Hello_World ]



有任何想法吗?

最佳答案

boost::variant每种声明的类型都有一个构造函数重载。在您的第一个示例中,bool 将有一个重载。一个用于 std::string .您现在使用 char[n] 调用构造函数可以隐式转换为两者。所以没有完美的匹配,只有两个候选人。但是,编译器不会告诉您调用不明确,而是选择 bool过载作为更好的匹配。

为什么?已经完美回答了in this question .

在您的第二个示例中,intstd::string你正在通过bool s 和 char[n]给构造函数。 bool可隐式转换为 int但不是 std::string . char[n]可隐式转换为 std::string但不是 int .因此调用相应的构造函数,因为每个构造函数只有一个候选者。

关于c++ - boost::variant 与 bool 和 string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63550179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com