这是今天的第二个编译器错误,让我感到困惑。不知何故,下面的代码,gcc抱怨代码的函数返回一个迭代器return_iter
返回冲突类型std::_Rb_tree_iterator<const int*>
然后std::_Rb_tree_const_iterator<const int*>
,但它们都不应该是const迭代器,因为该集合不是const。任何人都可以解释为什么在非const左值上调用std::end()
方法返回const_iterator
?std :: set迭代器的冲突返回类型
完整的代码粘贴在下面。
注意我只有在与gcc
编译时才会出现此错误。此错误不会显示出来,当我编译这段铿锵(Apple LLVM version 8.0.0 (clang-800.0.38)
。我使用的gcc版本是g++ (GCC) 5.1.0
一个相关的问题。这是正确的使用着的?是不是考虑行调用std::forward
只要你想使用转发引用吗?我之所以把它称为以下是以防万一的类型重载一些方法,当对象是右值..
#include <vector>
#include <string>
#include <set>
#include <iostream>
using namespace std;
int global_value = 1;
class LessPtr {
public:
template <typename PointerComparableOne, typename PointerComparableTwo>
constexpr auto operator()(PointerComparableOne&& lhs,
PointerComparableTwo&& rhs) const {
return *std::forward<PointerComparableOne>(lhs) <
*std::forward<PointerComparableTwo>(rhs);
}
using is_transparent = std::less<void>::is_transparent;
};
template <typename Container, typename Key>
auto return_iter(Container&& container, Key&& key) {
if (global_value == 1) {
return std::forward<Container>(container).lower_bound(std::forward<Key>(key));
}
else {
return std::end(std::forward<Container>(container));
}
}
void do_stuff(std::set<const int*, LessPtr>& set_ptrs) {
// auto value = string{"something"};
auto value = 1;
auto iter = return_iter(set_ptrs, &value);
cout << reinterpret_cast<void*>(&iter) << endl;
}
int main() {
std::set<const int*, LessPtr> set_ptrs;
do_stuff(set_ptrs);
return 0;
}
以某种方式所需的LessPtr
导致此错误。 。
顺便说一句,不要做'std :: end(std :: forward(container))''。 –
@ T.C。我正在寻找某人对此发表评论!你能解释为什么那么糟糕?我正在考虑这个问题,不能得出一个好的结论,为什么我不应该那样做 – Curious
免费的'begin'和'end'不是用于rvalues的,并且如果给定的话不能正确运行。 –