2014-12-01 24 views
5

Burada, What requirements must std::map key classes meet to be valid keys? ve bazı diğer iletilerde, bir srd :: map'in Anahtar türünün bir atama işlecine sahip olması önerilir. Ancak bu gerekliliği standartta bulamadım.Anahtar türü için atama operatörü gereksinimi std :: map

#include <map> 

struct Foo 
{ 
    Foo& operator=(const Foo&) = delete; 

    int id; 
}; 

bool operator<(const Foo&, const Foo&) { return(false); } 

int main(int, char**) 
{ 
    std::map<Foo,int> a; 
    std::map<Foo,int> b; 

    a = b; // Should this work if Foo does not have an assignment operator? 

    return(false); 
} 

yukarıda GCC 4.9 ve Visual Studio 2013 ile derler, ancak aşağıdaki komutu çalışan bir Ubuntu 14.10 kutuyu clang 3.5 ile, bir atama operatör eksikliğinden şikayetçi başarısız "çınlama ++ -std = C++ 11 -stdlib = libC++ code.cpp ". Clang, GCC standart kitaplığını kullanırken başarılı olur. Clang standart kütüphanesinin burada kırıldığından şüpheleniyorum.

+0

++ 1 İhtiyaç duyulması için küçük pratik nedenler düşünebilirim. Bu ödev, örneğin kopya oluşturma ile kolayca yapılmalıdır. Hmm. – Yakk

cevap

4

§23.1 [container.requirements.general]/p15 & Tablo 99: Tablo 99 de

, X tip A bir ayırıcısı kullanarak T bir value_type bir ayırıcı ile uyumlu kap sınıfını belirtmektedir

, u bir değişken a ve b tip X, t bir lvalue veya tip X bir const rvalue belirtmektedir olmayan const Sol taraf ifade temsil eder, rv bir 012 belirtmektedir, const olmayan X ve m rutinleri, A türünde bir değerdir.

Tablo 99 (ayırıcısı farkında konteyner gereksinimleri) ilgili parçasıdır: o zaman

+-----------+-------------+--------------------------------+------------+ 
|Expression | Return type | Assertion/note    | Complexity | 
|   |    | pre-/post-condition   |   | 
|-----------+-------------+--------------------------------+------------+ 
| a = t |  X&  | Requires: T is CopyInsertable | linear  | 
|   |    | into X and CopyAssignable.  |   | 
|   |    | post: a == t     |   | 
+-----------+-------------+--------------------------------+------------+ 

Ve §23.2.4 [associative.reqmts]/s 7

ilişkisel diyor ve ve multimap için Allocator-bilinçli kapların (23.2.1) tüm gereksinimlerini karşılar, value_type'da bulunan gereksinimler 96, key_type ve mapped_type yerine uygulayın. [Not: Örneğin, bazı durumlarda key_type ve mapped_type olarak, CopyAssignablevalue_type, pair<const key_type, mapped_type> değil yalnızca ilişkili halde CopyAssignable olması gerekmektedir. - sonu notu]

Not bu referanslar Tablo 96, ama niyet Tablo 96'da şey aslında CopyAssignable gerektirdiğinden, hem de Tablo 99 kapsayacak şekilde açıkça not verilir. value_type, pair<const key_type, mapped_type>, asla CopyAssignable olduğundan, Tablo 99'un gerekliliklerini okumak oldukça anlamsız olacaktır.

+0

Bunun için, ilişkisel olmayan kapsayıcı referans veren 23.2.4 bit özledim. – goneskiing

+0

23.2.4'teki "Not:" öğesinin anlamı, öğesinin CopyAssignable olması gerekmiyor. Öyleyse libC++, bir çift bir diğerine atadığı için yanlış olabilir. Bazı durumlarda "biraz" gibi kelimeler buluyorum, farklı uygulamaların farklı kodları kabul etmesine izin veriyor gibi görünüyorlar. Belki de kavramlar hepimizi kurtaracak! – goneskiing

+0

@goneskiing Bir 'pair ' alamazsınız çünkü bu eleman 'const', ve Table 99'un CopyAssignable gereksinimi 23.2.4/p7 tarafından reddedilmedikçe' value_type' üzerindedir. –

İlgili konular