2016-01-15 25 views
5

allocator_arg_t std :: kullanarak bir kurucu ile sınıf Burada http://en.cppreference.com/w/cpp/memory/scoped_allocator_adaptor/constructstd :: scoped_allocator_adaptor ve

bazı kelimeler ise bulmak std::uses_allocator<T, inner_allocator_type>::value==true (tip T mesela öyle, bir kap tahsisatçısı kullanır)

ve std::is_constructible<T, std::allocator_arg_t, inner_allocator_type, Args...>::value==true,

sonra

std::allocator_traits<OUTERMOST>::construct(OUTERMOST(*this), 
              p, 
              std::allocator_arg, 
              inner_allocator(), 
              std::forward<Args>(args)...); 
çağırırsa 210

Yani, basit bir testi yapmak

struct use_arg { 
    template <typename Alloc> 
    use_arg(std::allocator_arg_t, Alloc &, int i) 
     { std::cout << i << " in use_arg()\n"; } 
}; 

namespace std { 

template <typename A> struct uses_allocator<use_arg, A>: true_type {}; 

} // namespace std 

void test_scoped() 
{ 
    std::scoped_allocator_adaptor<std::allocator<use_arg>> sa; 
    auto p = sa.allocate(1); 
    sa.construct(p, 4); 
    sa.destroy(p); 
    sa.deallocate(p, 1); 
} 

ancak gcc, clang bana da use_arg yerine use_a yazma bu hataları https://gist.github.com/anonymous/3e72754a7615162280fb

ver. Başarılı bir şekilde çalışabilir.

struct use_a { 
    template <typename Alloc> 
    use_a(int i, Alloc &) { std::cout << i << " in use_a()\n"; } 
}; 

Bu davranışlar ne yapar?

cevap

3

Sanırım hem libstdC++ hem de libC++, OP'nin örneği için standardın tam olarak ne istediğini yapıyor.

uses_allocator<use_arg, allocator<use_arg>> doğru ama use_arg bir rvalue ayırıcı gelen constructible değil, bu yüzden construct çağrı kötü oluşturulması gerektiği için is_constructible<use_arg, allocator_arg_t, inner_allocator_type, int> yanlıştır. Ancak, standartta bir kusur olduğunu düşünüyorum. Bu tür düşünün:

struct use_arg { 
    using allocator_type = std::allocator<use_arg>; 
    use_arg(allocator_type&&) { } 
}; 

uses_allocator ve is_constructible özellikleri ikisi de doğruysa, ancak derlemek başarısız olur scoped_allocator_adaptor::construct(pointer) çağırır.

is_constructible<T, inner_allocator_type>'u (bir rivalue allocator'dan yapılan bir sınama için yapılan sınamalar) denetlemek tutarsızdır, ancak inner_allocator_type&'u (ki bu bir değer) geçer, ancak standardın söylediği de budur.

1

Sorun şu ki, Alloc başvurusunu alırsınız. Senin durumunda inner_allocator yılında

burada
std::is_constructible<T, std::allocator_arg_t, inner_allocator_type, Args...>::value==true 

sadece std::scoped_allocator_adaptor<std::allocator<use_arg>> olduğunu ve std::scoped_allocator_adaptor<std::allocator<use_arg>>& dönüştürülebilir edilemez. Yalnızca Alloc değerini veya const-reference numarasını alabilirsiniz.

+0

Ne hakkında std :: is_constructible >> :: değer '? Ayrıca 'yanlış' ama inşa edebilir. – linux40

+0

@ linux40 bir hataya benziyor, çünkü örneğin clang'da bu kontrol yok, sadece uses_allocator :: value kontrol edildi. – ForEveR

+0

da gcc'de sadece bir kontrol var. – ForEveR

İlgili konular