gpt4 book ai didi

c++ - 无法编译包含 "if constexpr"的函数模板实例化

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:46 25 4
gpt4 key购买 nike

抱歉标题含糊不清,但我想不出更好的标题。

我写了一个函数来压扁容器:

template <typename Container, typename OutIt>
void flatten(const Container& container, OutIt res)
{
if constexpr (std::is_convertible_v<typename Container::value_type, typename std::iterator_traits<OutIt>::value_type>)
{
for (const auto& value : container)
{
*res = value;
++res;
}
}
else
{
for (const auto& subContainer : container)
flatten(subContainer, res);
}
}

我希望它像这样使用:

vector<vector<int>> test = {{1}, {2, 3, 4}, {5, 6}, {7}};
vector<int> res;
flatten(test, std::back_inserter(res));

这基本上应该从 test 复制所有嵌套值至 res ,所以 res == { 1, 2, 3, 4, 5, 6, 7 } .

但是,如果我想编译代码,编译器会抛出一些错误,基本上是说 else 中的代码分支被编译而不是 if constexpr block 。

即第一个实例化是 void flatten<vector<vector<int>>, OutIt>()哪个是正确的。第二个实例化(由 else block 触发)是 void flatten<vector<int>, OutIt>()这也是正确的。但是对于第二次实例化,if constexpr表达式的计算结果应为 true , 作为 vector<int>::value_typeintstd::iterator_traits<OutIt>::value_type>也是int .但不知何故,编译器试图实例化第三个模板 void flatten<int, OutIt>()这会导致编译器错误(因为我尝试迭代一个整数)。

为什么编译器实例化第三个模板?

最佳答案

你传入一个 std::back_insert_iterator ,为此 value_typevoid .所以 if 语句的真正分支永远不会被实例化。

一个可能的解决方案是尝试检查分支的作用。这可以通过 std::is_assignable 来完成。和一些涉及 decltype(*declval<OutIt>()) 的样板文件.

关于c++ - 无法编译包含 "if constexpr"的函数模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50213464/

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