N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(22)3.5 Program and linkage [basic.link] p61

# はじめに
N4606 Working Draft, Standard for Programming Language C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/#mailing2016-11
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf

n4606は、ISO/IEC JTC1 SC22 WG21の作業原案(Working Draft)です。
公式のISO/IEC 14882原本ではありません。
ISO/IEC JTC1 SC22 WG21では、可能な限り作業文書を公開し、幅広い意見を求めています。
一連の記事はコード断片をコンパイルできる形にする方法を検討してコンパイル、リンク、実行して、規格案の原文と処理系(g++, Clang++)との違いを確認し、技術内容を検討し、ISO/IEC JTC1 SC22 WG21にフィードバックするために用います。
また、CERT C++, MISRA C++等のコーディング標準のコード断片をコンパイルする際の参考にさせていただこうと考えています。CERT C++, MISRA C++が標準化の動きとの時間的な擦れの確認が結果としてできれば幸いです。

## list
N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(1) coding list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/

## Compiler
### clang++ --version
clang version 6.0.0 (tags/RELEASE_600/final)

### g++-7 --version
g++-7 (Homebrew GCC 7.3.0_1) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.

# (22)3.5 Program and linkage [basic.link]
p61

```c++:p61.cpp
// N4606 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf 
#define msg "p61.cpp (22)3.5 Program and linkage [basic.link]"

#include <iostream>
static void f();
static int i = 0; // #1
void g() {
  extern void f(); // internal linkage
  int i; // #2 i has no linkage
  {
  extern void f(); // internal linkage
  extern int i; // #3 external linkage
  }
}

namespace X {
  void p() {
  q(); // error: q not yet declared
  extern void q(); // q is a member of namespace X
}
void middle() {
  q(); // error: q not yet declared
}
void q() { /* ... */ } // definition of X::q
}
void q() { /* ... */ } // some other, unrelated q

template <class T> struct B {
  void g(T) { }
  void h(T);
  friend void i2(B, T) { }
};
void f() {
  struct A { int x; }; // no linkage
  A a = { 1 };
  B<A> ba; // declares B<A>::g(A) and B<A>::h(A)
  ba.g(a); // OK
  ba.h(a); // error: B<A>::h(A) not defined in the   translation unit
  i2(ba, a); // OK
}

int main(int argc, char *argv[], char *envp[]){
  std::cout << msg << std::endl;
  return EXIT_SUCCESS;
}
```

```shell_session
$ ./cppgl.sh p61
$ clang++ p61.cpp
p61.cpp:19:3: error: use of undeclared identifier 'q'
  q(); // error: q not yet declared
  ^
p61.cpp:23:3: error: use of undeclared identifier 'q'
  q(); // error: q not yet declared
  ^
2 errors generated.

$ g++-7 p61.cpp
p61.cpp: In function 'void X::p()':
p61.cpp:19:3: error: 'q' was not declared in this scope
   q(); // error: q not yet declared
   ^
p61.cpp: In function 'void X::middle()':
p61.cpp:23:3: error: 'q' was not declared in this scope
   q(); // error: q not yet declared
   ^
p61.cpp: At global scope:
p61.cpp:31:8: error: 'void B<T>::h(T) [with T = f()::A]', declared using local type 'f()::A', is used but never defined [-fpermissive]
   void h(T);
        ^
p61.cpp:31:8: warning: 'void B<T>::h(T) [with T = f()::A]' used but never defined
```

# 検討事項
　コンパイルエラーにならない変更。
　内容の出力。
  h(T)がgccだけエラーになることの是非。

# 参考資料

コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da
Qiitaに投稿するCのStyle例(暫定)
https://qiita.com/kaizen_nagoya/items/946df1528a6a1ef2bc0d
# 文書履歴
ver. 0.10 初稿 2080415
ver. 0.11 URL追記　20230215
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.