2017-05-25 110 views
19

我看過匿名類C++代碼在Quora上。它已成功編譯並運行。是否可以在C++中使用匿名類?

代碼在這裏:

#include <iostream> 

auto func() 
{ 
    class // no name 
    { 
     public: 
      int val; 
    } a; 

    a.val = 5; 

    return a; 
} 

int main() 
{ 
    std::cout << func().val << std::endl; 
    return 0; 
} 

所以,是在C++有效嗎?

此外,我很想知道,是否有可能在C++中使用匿名類?

+3

這是有點[先前問](https://stackoverflow.com/questions/3612164/c-anonymous-class-initialization) –

+1

C++有[匿名工會](http://eel.is/c++ draft/class.union.anon),但沒有匿名的類/結構體,一些編譯器提供的作爲擴展。儘管如此,問題中顯示的未命名類仍然有效。 – cpplearner

+1

@cpplearner anonymius聯合是沒有名字(成員,不是類型)的聯合類型的類*成員*。 –

回答

16

在C++中,一個匿名聯合是這種形式的聯合:

union { ... } ; 

它定義一個未命名的類型的未命名的對象。它的成員被注入到周圍的範圍內,所以可以在不使用<object>.前綴的情況下引用它們,否則將是必要的。

從這個意義上說,不存在匿名類(在C++聯合中不是聯合是類)。另一方面,未命名的類(包括結構和聯合)沒有什麼不尋常的。

union { ... } x; 
class { ... } y; 
typedef struct { ... } z; 

xy被命名爲未命名類型的對象。 z是一個typedef名稱,它是未命名結構的別名。他們不被稱爲匿名,因爲這個術語是爲上述聯合形式保留的。

[](){} 

Lambdas是未命名類類型的未命名對象,但它們也不被稱爲匿名對象。

+0

不是'std :: function'類型的lambdas? –

+3

@DonaldDuck不,他們可以轉換爲std :: function,但每個lambda都有自己的唯一類型。 –

+0

@DonaldDuck不,他們有一個實現定義的類型。 'std :: function'使用type-erasure來綁定任何可以像函數一樣調用的類/函數,例如函數對象,比如lambda。 – Rakete1111

31

不僅如此,您還可以使用decltype創建更多類的實例。

#include <iostream> 

class 
{ 
    public: 
     int val; 
} a; 


int main() 
{ 
    decltype(a) b; 
    a.val = 10; 
    b.val = 20; 

    std::cout << a.val << std::endl; 
    std::cout << b.val << std::endl; 
    return 0; 
} 

輸出:

10 
20 
+1

在C++ 11之前,沒有辦法聲明另一個未命名類的實例嗎? – lisyarus

+4

@lisyarus:這是可能的模板,如'template T create(const T&prototype){return T(); }' –

+0

@AlexandreC。但是如果我無法訪問類型('create'之外),那麼如何將'create'的結果賦值給一個局部變量? – lisyarus

9

它總是可以編寫這樣的事:

typedef struct { int a; } type; 

現在,如果你看一下struct { int a }一部分,這是一個匿名結構。在C++中,結構和類之間基本上沒有區別(除了默認訪問修飾符)。所以,有可能擁有匿名結構/類。

相關問題