私はthis questionへの答えとしてこのコードを投稿しようとしていました。考え方はをpointeeに委任し、filter
関数が値を変更できないようにすることです。g ++とclang ++ - オーバーロードされた変換演算子によって取得されたポインタを削除するあいまいさ
#include <iostream>
#include <vector>
template <typename T>
class my_pointer
{
T *ptr_;
public:
my_pointer(T *ptr = nullptr) : ptr_(ptr) {}
operator T* &() { return ptr_; }
operator T const*() const { return ptr_; }
};
std::vector<my_pointer<int>> filter(std::vector<my_pointer<int>> const& vec)
{
//*vec.front() = 5; // this is supposed to be an error by requirement
return {};
}
int main()
{
std::vector<my_pointer<int>> vec = {new int(0)};
filter(vec);
delete vec.front(); // ambiguity with g++ and clang++
}
のVisual C++ 12と14エラーなしでこれをコンパイルしますが、GCCとあいまいさがあることをClang on Coliru主張。私は彼らにnon-const std::vector::front
過負荷を選択してからmy_pointer::operator T* &
を選択することを期待していましたが、それはなぜですか?
constオーバーロードの参照を返すようにしてください – bolov
基本的には、コンパイラはまず何を変換するかを決定してから、オーバーロード解決を実行する必要があります。しかし、ここでは 'int *'と 'const int *'が両方ともコンテキストによって許可されているので、最初のステップで失敗します。 –