簡體   English   中英

C ++中的多個聲明

[英]Multiple Declarations in C++

在[basic.scope.declarative] p4中,有人讀

給定一個聲明區域中的一組聲明,每個聲明都指定相同的非限定名稱, - (4.1)它們都應引用同一實體......

天真的閱讀可能意味着以下代碼可能有效,因為“兩個聲明都引用同一個實體”:

int x;
int x;

然后可能會記住一個定義規則[basic.def.odr] p1。 上述推理可能僅適用於不是定義的聲明。 區別在[basic.def] p2中詳細說明。 例如,以下代碼肯定是有效的:

extern int x;
extern int x;

[basic.def] p2中的最后一個示例表明以下代碼應該有效,但它不能編譯(使用MSVC2015)。

struct B
{
    int y;
};

struct D : B
{
    using B::y;
    using B::y;
};

問題出在哪兒?


錯誤消息是

'B :: y'的using聲明不能與'B :: y'的現有using聲明共存

[namespace.udecl] p10中的這個示例與您的完全相同:

struct B {
   int i;
};
struct X : B {
   using B::i;
   using B::i; // error: double member declaration
};

該錯誤由[class.mem] p1備份:

成員不應在成員規范中聲明兩次,除非可以聲明嵌套類或成員類模板,然后再定義,除了可以使用opaque-enum-declaration引入枚舉 ,稍后使用enum-specifier

所以你走在正確的軌道上。 多個聲明都可以,只要它們不破壞其他規則(例如一個定義,成員規范等)

例如,以下內容很好:

struct X;
struct X;

或者更復雜的例子:

struct X 
{
    struct A;
    struct A
    {
       int y;
    };
}; 

struct X;
struct X::A;

你幾乎通過引用namespace.udecl / 10回答了你自己的問題。 下面的示例(N3936)顯示了允許多個等效using -declarations的位置:

namespace A {
    int i;
}
namespace A1 {
    using A::i;
    using A::i; // OK: double declaration
}
void f() {
    using A::i;
    using A::i; // error: double declaration
}
struct B {
    int i;
};
struct X : B {
    using B::i;
    using B::i; // error: double member declaration
};

在命名空間塊范圍內,還允許對函數進行多次using聲明。 至於為什么在塊范圍內不允許它們用於變量(對象),我不知道。 可能不允許多個等效成員聲明,​​原因有兩個:

  • 初始化命令錯誤的巨大潛力
  • 它在歷史上沒有必要,因為內聯定義的方法體“看到”稍后在同一類中聲明的成員(在C ++ 11中引入了decltype ,這個原因不再是確定的)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM