【发布时间】:2015-12-19 14:36:40
【问题描述】:
我试图通过制作此指针包装器(替换原始指针)将此代码作为对this question 的回答。这个想法是将const 委托给它的指针,这样filter 函数就不能修改这些值。
#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 声称存在歧义。我期待他们选择非常量 std::vector::front 重载,然后选择 my_pointer::operator T* &,但没有。这是为什么呢?
【问题讨论】:
-
尝试让 const 重载也返回一个引用
-
基本上,标准说编译器需要首先决定要转换成什么,然后运行重载决议。但在这里它在第一步失败,因为
int*和const int*都是上下文允许的。