根據cppreference調用std::unique_ptr::operator*()
相當於調用*(std::unique_ptr::get())
。unique_ptr自定義指針類型:* get()和operator *()給出不同的輸出
但是我得到不同的結果這兩個調用。這裏是我的代碼:
#include <iostream>
#include <string>
#include <memory>
#include <fcntl.h>
#include <unistd.h>
struct file_descriptor
{
private:
struct closer;
public:
typedef int handle_type;
typedef closer closer_type;
constexpr static handle_type kInvalidHandle = -1;
public:
file_descriptor(int handle = kInvalidHandle) : handle_{ handle } { }
file_descriptor(std::nullptr_t) : file_descriptor{ } { }
operator int&() { return handle_; }
operator int() const { return handle_; }
int& operator*() { return static_cast<int&>(*this); }
int operator*() const { return static_cast<int>(*this); }
bool operator==(const file_descriptor& other) const
{ return (handle_ == other.handle_); }
bool operator!=(const file_descriptor& other) const
{ return !(*this == other); }
private:
struct closer
{
typedef file_descriptor pointer;
void operator()(pointer handle) const
{ ::close(*handle); }
};
int handle_;
};
using unique_file_ptr = std::unique_ptr<typename file_descriptor::handle_type,
typename file_descriptor::closer_type>;
unique_file_ptr managed_open(const std::string& path)
{
return { ::open(path.c_str(), O_RDWR), { } };
}
int main(int, char**)
{
auto handle = managed_open("/dev/random");
std::cout << "*handle : " << *handle << std::endl;
std::cout << "*handle.get(): " << *handle.get() << std::endl;
}
我的輸出(實時輸出here):
*handle : 4198400
*handle.get(): 3
請注意*handle.get()
返回正確的值,而*handle
沒有。
爲什麼我會得到不同的結果?
@Lingxi否:'decltype(&:: open)= int(*)(const char *,int,...)'。我想這是因爲'file_descriptor'可以從'int'構造。 – 2015-04-03 15:54:08
有趣的事情發生,因爲你也重載'file_descriptor :: operator *'?嘗試刪除,看看你得到什麼。 – 2015-04-03 16:02:29
@RichardHodges有趣的是,當我註釋掉'operator *()'時,出現以下錯誤:'.../include/C++/4.8/bits/unique_ptr.h:222:9:error:indirection requires指針操作數('pointer'(aka'file_descriptor')無效) return * get();',這意味着'unique_ptr :: operator *()'等同於'* get()'。這使我相信我在代碼中以某種方式調用UB。 – 2015-04-03 16:08:11