Есть ли другой способ доказать это, кроме использования ключевого слова extern: черновик n3290 - PullRequest
8 голосов
/ 26 июля 2011

Точка из ISO проекта N3290: Поиск безусловного имени: раздел 3.4.1, пункт 14:

Если переменная-член пространства имен определена вне области его действия пространство имен, то любое имя, которое появляется в определении члена (после идентификатора объявления) ищется, как будто определение члена произошло в его пространстве имен.

например:

namespace N {
   int i = 4;
   extern int j;
}
int i = 2;
int N::j = i;       // N::j == 4

Есть ли другой способ доказать это, кроме использования ключевого слова extern

Можете ли вы привести некоторые другие примеры ... кроме extern

Ответы [ 4 ]

4 голосов
/ 26 июля 2011

Другой пример, в котором не используется ключевое слово extern:

//demo.cpp

int i = 100;
namespace N
{
    int i = 200;
    struct A
    {
        static int m;
    };
}

int N::A::m = i; //i is 100 or 200?

int main()
{
   cout << N::A::m << endl; //what will it print?
}

Выход:

200

Онлайн демо: http://www.ideone.com/pRVAb

1 голос
/ 26 июля 2011

Другой пример касается определения статического члена в классе .

// header
namespace N {
  const int i = 4;
  class A
  {
  public:
    static int m_i;
  };
}

// source file
int i = 2;
int N::A::m_i = i;  // N::A::m_i == 4

int main(int argc, char* argv[])
{
  cout << N::A::m_i << endl;
  return 0;
}
1 голос
/ 26 июля 2011

Этот код не использует extern, но он более или менее подтверждает это. Обратите внимание, что он не определяет переменную вне пространства имен, он вместо этого определяет function вне пространства имен.

//demo.cpp

int i = 100;
namespace N
{
   int i = 200;
   struct X{};
   void f(const X&);

}

void N::f(const X&)
{
   cout << i << endl; //what will it print?
}

int main()
{
    N::X x;
    f(x); //use argument-dependent lookup (ADL) to find the function!
}

Выход:

200

Демо онлайн: http://www.ideone.com/KCqUV

Я добавил ADL, чтобы сделать его более интересным!

0 голосов
/ 26 июля 2011
// header.h
struct X { void bar () {} };
namespace N {
 struct X { void bar () {} };
 void foo(X *p = new X);
}

// implementation.cpp
#include"header.h"

N::foo(X* p) { p->bar(); } // N::X::bar() called

Этот пример без использования extern.(хотя это подразумевается).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...