4

これは、今日私を混乱させた 2 番目のコンパイラ エラーです。どういうわけか、以下のコードの場合、gcc は、コードにreturn_iter競合する型を返すイテレータを返す関数がありstd::_Rb_tree_iterator<const int*>、次にを返す関数があると文句を言いstd::_Rb_tree_const_iterator<const int*>ますが、セットが const ではないため、両方とも const イテレータであってはなりません。std::end()const 以外の左辺値で呼び出されたときにメソッドが を返す理由を誰か説明できますconst_iteratorか?

完全なコードを以下に貼り付けます。

でコンパイルした場合にのみ、このエラーが発生することに注意gccしてください。これを clang ( でコンパイルすると、このエラーは表示されませんApple LLVM version 8.0.0 (clang-800.0.38)。私が使用している gcc のバージョンはg++ (GCC) 5.1.0

関連する質問です。これは forward の正しい使い方ですか? 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エラーを引き起こすには、どういうわけか必要です..

4

1 に答える 1