2016-11-24 2 views
4

최근에 하나의 요소에 std::tuple<>을 사용하는 데 문제가 있음을 발견했습니다. 나는 타입 소거를위한 클래스를 생성하고 N 개의 참조 된 객체를 유지했다. 그러나 참조 카운트 된 개체가 std::tuple<>에있는 유일한 개체 인 경우 유지되지 않습니다.std :: tuple <> 중 하나의 std :: shared_ptr <>이 작동하지 않습니까?

내가 잘못 했나요? (엑스 코드 8.0 테스트)

class token { 
public: 
    template<typename... Types> 
    token(Types... types) : _self(std::make_shared<const std::tuple<Types...>>(std::make_tuple(std::move(types)...))) {} 

    // Why do I need this special version of the constructor? 
    // Uncomment and the code will work! 
    //template<typename T> 
    //token(T t) : _self(std::make_shared<const T>(std::move(t))) {} 
private: 
    std::shared_ptr<const void> _self; 
}; 

예 : 내 관점에서

token make_token() { 
    std::shared_ptr<int> shared(new int(), [](int* i) { 
    // Called immediately if using only tuple constructor! 
    }); 
    return token(shared); 
} 
token my_token = make_token(); // std::shared_ptr<> is already gone! 
+0

은 gcc에서 작동하지만 clang에서는 작동하지 않습니다. – Danh

+0

@ Danh Thanks! 나는 그 때 미치지 않을 것이다. 누구에게 이것을보고합니까? –

+0

트렁크에 고정 된 것 같습니다 (http://melpon.org/wandbox/permlink/8YUeWAcj3PzyWphs). –

답변

1

, 당신의 코드가 잘, MSVC 및 GCC 작동합니다은 this snippet 나와 함께 동의하는 것 같다. T.C.에서

#include <iostream> 
#include <tuple> 
#include <memory> 

template <class T> 
struct unwrap_refwrapper 
{ 
    using type = T; 
}; 

template <class T> 
struct unwrap_refwrapper<std::reference_wrapper<T>> 
{ 
    using type = T&; 
}; 

template <class T> 
using special_decay_t = typename unwrap_refwrapper<typename std::decay<T>::type>::type; 

class token { 
public: 
    template<typename... Types> 
    token(Types&&... types) : _self(std::make_shared<std::tuple<special_decay_t<Types>...>>(std::forward<Types>(types)...)) {} 

private: 
    std::shared_ptr<void> _self; 
}; 


token make_token() { 
    return token(std::shared_ptr<int>(new int(), [](int* i) { 
    std::cout << "freed\n"; 
    delete i; 
    })); 
} 

int main() 
{ 
    token my_token = make_token(); 
    std::cout << __LINE__ << '\n'; 
} 

demo를 참조하십시오, 이것은 그 소리와 함께 실제 문제처럼 보였다되고 댓글과 지금은 해결 방법으로 그 소리 트렁크

에 고정되어, 나는 (special_decay_tcppreference에서 가져온 것입니다)이 접근 방식을 제안

관련 문제