Bu işaretçi sarıcı (ham işaretçiyi değiştirerek) yaparak bu kodu this question'a yanıt olarak göndermeye çalışıyordum. Buradaki fikir, const
'u pointee'ye atamaktır, böylece filter
işlevi değerleri değiştiremez.g ++ ve clang ++ - aşırı yüklenmiş dönüşüm operatörü belirsizliği tarafından edinilen işaretçi silme
#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 ve 14 bir hata olmadan derleme bu ancak GCC ve bir belirsizlik olmaması Clang on Coliru iddia. Ben std::vector::front
aşırı yüklenme ve my_pointer::operator T* &
, ancak hayır. Nedenmiş?
const aşırı yüklenmeyi geri döndürmeyi denemeye çalışın – bolov
Temel olarak, standart derleyicinin neyin dönüştürüleceğine ilk karar vermesi gerektiğini ve sonra aşırı yük çözünürlüğünü çalıştırması gerektiğini söylüyor. Ama burada ilk adımda başarısız oluyor çünkü int * 've' const int * 'her ikisi de içeriğe izin veriyor. –