我發現賦值塊在Objective-C類參數和C++類參數方面的行爲不同。分配塊指針:Objective-C和C++類之間的區別
想象我有這個簡單的Objective-C類層次結構:
@interface Fruit : NSObject
@end
@interface Apple : Fruit
@end
然後,我可以寫這樣的東西:
Fruit *(^getFruit)();
Apple *(^getApple)();
getFruit = getApple;
這意味着,對於Objective-C類 ,塊返回類型爲協變:返回更具體的東西的塊可以看作是返回更一般東西的塊的「子類」。在這裏,提供蘋果的getApple
塊可以安全地分配給getFruit
塊。事實上,如果以後使用,當您預計Fruit *
時,它總是保存爲接收Apple *
。而且,從邏輯上講,逆向不起作用:getApple = getFruit;
不能編譯,因爲當我們真的想要一個蘋果時,我們並不開心得到一個水果。
同樣,我可以寫:
void (^eatFruit)(Fruit *);
void (^eatApple)(Apple *);
eatApple = eatFruit;
這表明塊在它們的參數類型協變:能夠處理一個參數,更一般的,可以使用一個塊,其中一個塊的過程需要更具體的論點。如果一個街區知道如何吃水果,它也會知道如何吃蘋果。再一次,反過來是不正確的,這不會編譯:eatFruit = eatApple;
。
這是一切都很好,在Objective-C中。現在讓我們嘗試在C++或Objective-C++,假設我們有這些類似的C++類:
class FruitCpp {};
class AppleCpp : public FruitCpp {};
class OrangeCpp : public FruitCpp {};
可悲的是,這些塊分配,不進行編譯更多:
FruitCpp *(^getFruitCpp)();
AppleCpp *(^getAppleCpp)();
getFruitCpp = getAppleCpp; // error!
void (^eatFruitCpp)(FruitCpp *);
void (^eatAppleCpp)(AppleCpp *);
eatAppleCpp = eatFruitCpp; // error!
鏘抱怨與「從不兼容的類型分配「錯誤。所以,相對於C++類,塊看起來是不變的返回類型和參數類型。
這是爲什麼?我對Objective-C類所做的論述是否也適用於C++類?我錯過了什麼?
最有可能的是,該功能被忽略了。有[提交](http://llvm.org/viewvc/llvm-project?view=revision&revision=125445)顯示鏗鏘人關心在Objective-C類型的Objective-C++中爲協變和逆變工作,但我不能'爲C++本身找到任何東西。 [語言規範塊](http://clang.llvm.org/docs/BlockLanguageSpec.html)也沒有提及。 – zneak 2013-03-09 16:18:14
我應該把它作爲一個錯誤/功能請求放在什麼地方? – 2013-03-09 16:23:04
您可以提交LLVM項目的錯誤和功能請求[此處](http://llvm.org/bugs/enter_bug.cgi)(需要使用有效的電子郵件進行免費註冊,就像大多數公衆的錯誤跟蹤程序一樣),但希望延遲至少有幾個月的時間。如果你真的瞭解它,如果你想自己製作補丁,郵件列表上的人可能會很樂意協助你。 – zneak 2013-03-09 16:46:10