C++N4606(189)14.5.7 Alias templates [temp.alias]p375


はじめに

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++が標準化の動きとの時間的なずれがあれば確認できれば幸いです。また、boostライブラリとの関連、Linux OS, TOPPERSカーネル、g++(GCC), clang++(LLVM)との関係も調査中です。
何か、抜け漏れ、耳より情報がありましたらおしらせくださると幸いです。

作業方針

1)コンパイルエラーを収集する。
2)コンパイルエラーをなくす方法を検討する。
コンパイルエラーになる例を示すだけが目的のコードは、コンパイルエラーをなくすのではなく、コンパイルエラーの種類を収集するだけにする。
文法を示すのが目的のコード場合に、コンパイルエラーをなくすのに手間がかかる場合は、順次作業します。
3)リンクエラーをなくす方法を検討する。
文法を示すのが目的のコード場合に、リンクエラーをなくすのに手間がかかる場合は、順次作業します。
4)意味のある出力を作る。
コンパイル、リンクが通っても、意味のある出力を示そうとすると、コンパイル・リンクエラーが出て収拾できそうにない場合がある。順次作業します。

1)だけのものから4)まで進んだものと色々ある状態です。一歩でも前に進むご助言をお待ちしています。「検討事項」の欄に現状を記録するようにしています。

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)
Target: x86_64-apple-darwin17.4.0

g++-7 --version

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

(189)14.5.7 Alias templates [temp.alias]p375

p375.cpp
// N4606 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf
#define msg "(189)14.5.7 Alias templates [temp.alias]p375.cpp"
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.

#include <iostream>

template<class T> struct Alloc { /* ... */ };
template<class T> using Vec = vector<T, Alloc<T>>;
Vec<int> v; // same as vector<int, Alloc<int>> v;
template<class T>
void process(Vec<T>& v)
{ /* ... */ }
template<class T>
void process(vector<T, Alloc<T>>& w)
{ /* ... */ } // error: redefinition
template<template<class> class TT>
void f(TT<int>);
f(v); // error: Vec not deduced
template<template<class,class> class TT>
void g(TT<int, Alloc<int>>);
g(v); // OK: TT = vector

template<typename...> using void_t = void;
template<typename T> void_t<typename T::foo> f();
f<int>(); // error, int does not have a nested type foo

template <class T> struct A;
template <class T> using B = typename A<T>::U;
template <class T> struct A {
typedef B<T> U;
};
B<short> b; // error: instantiation of B<short> uses own type via A<short>::U

int main() {
  std::cout<< msg << std::endl;
  return EXIT_SUCCESS;
}
$ ./cppgl17.sh p375
$ clang++ p375.cpp
p375.cpp:13:31: error: no template named 'vector'; did you mean 'std::vector'?
template<class T> using Vec = vector<T, Alloc<T>>;
                              ^~~~~~
                              std::vector
/usr/local/Cellar/llvm/6.0.0/include/c++/v1/iosfwd:200:28: note: 'std::vector' declared here
class _LIBCPP_TEMPLATE_VIS vector;
                           ^
p375.cpp:14:10: error: implicit instantiation of undefined template 'std::__1::vector<int, Alloc<int> >'
Vec<int> v; // same as vector<int, Alloc<int>> v;
         ^
/usr/local/Cellar/llvm/6.0.0/include/c++/v1/iosfwd:200:28: note: template is declared here
class _LIBCPP_TEMPLATE_VIS vector;
                           ^
p375.cpp:19:14: error: no template named 'vector'; did you mean 'std::vector'?
void process(vector<T, Alloc<T>>& w)
             ^~~~~~
             std::vector
/usr/local/Cellar/llvm/6.0.0/include/c++/v1/iosfwd:200:28: note: 'std::vector' declared here
class _LIBCPP_TEMPLATE_VIS vector;
                           ^
p375.cpp:19:6: error: redefinition of 'process'
void process(vector<T, Alloc<T>>& w)
     ^
p375.cpp:16:6: note: previous definition is here
void process(Vec<T>& v)
     ^
p375.cpp:23:1: error: unknown type name 'f'
f(v); // error: Vec not deduced
^
p375.cpp:26:1: error: unknown type name 'g'
g(v); // OK: TT = vector
^
p375.cpp:30:1: error: C++ requires a type specifier for all declarations
f<int>(); // error, int does not have a nested type foo
^
p375.cpp:30:1: error: template specialization requires 'template<>'
f<int>(); // error, int does not have a nested type foo
^~~~~~
template<> 
p375.cpp:33:20: error: no type named 'U' in 'A<T>'
template <class T> using B = typename A<T>::U;
                   ^~~~~
p375.cpp:35:9: note: in instantiation of template type alias 'B' requested here
typedef B<T> U;
        ^
9 errors generated.

$ g++-7 p375.cpp
p375.cpp:13:31: error: 'vector' does not name a type; did you mean 'wctob'?
 template<class T> using Vec = vector<T, Alloc<T>>;
                               ^~~~~~
                               wctob
p375.cpp:14:1: error: 'Vec' does not name a type; did you mean 'getc'?
 Vec<int> v; // same as vector<int, Alloc<int>> v;
 ^~~
 getc
p375.cpp:16:14: error: variable or field 'process' declared void
 void process(Vec<T>& v)
              ^~~
p375.cpp:16:14: error: 'Vec' was not declared in this scope
p375.cpp:16:14: note: suggested alternative: 'getc'
 void process(Vec<T>& v)
              ^~~
              getc
p375.cpp:16:19: error: expected primary-expression before '>' token
 void process(Vec<T>& v)
                   ^
p375.cpp:16:22: error: 'v' was not declared in this scope
 void process(Vec<T>& v)
                      ^
p375.cpp:19:14: error: variable or field 'process' declared void
 void process(vector<T, Alloc<T>>& w)
              ^~~~~~
p375.cpp:19:14: error: 'vector' was not declared in this scope
p375.cpp:19:14: note: suggested alternative: 'wctob'
 void process(vector<T, Alloc<T>>& w)
              ^~~~~~
              wctob
p375.cpp:19:22: error: expected primary-expression before ',' token
 void process(vector<T, Alloc<T>>& w)
                      ^
p375.cpp:19:31: error: expected primary-expression before '>' token
 void process(vector<T, Alloc<T>>& w)
                               ^~
p375.cpp:19:35: error: 'w' was not declared in this scope
 void process(vector<T, Alloc<T>>& w)
                                   ^
p375.cpp:23:2: error: expected constructor, destructor, or type conversion before '(' token
 f(v); // error: Vec not deduced
  ^
p375.cpp:26:2: error: expected constructor, destructor, or type conversion before '(' token
 g(v); // OK: TT = vector
  ^
p375.cpp:30:1: error: specializing member '::f<int>' requires 'template<>' syntax
 f<int>(); // error, int does not have a nested type foo
 ^~~~~~
p375.cpp: In substitution of 'template<class T> using B = typename A::U [with T = short int]':
p375.cpp:35:14:   required from 'struct A<short int>'
p375.cpp:33:46:   required by substitution of 'template<class T> using B = typename A::U [with T = short int]'
p375.cpp:37:8:   required from here
p375.cpp:33:46: error: invalid use of incomplete type 'struct A<short int>'
 template <class T> using B = typename A<T>::U;
                                              ^
p375.cpp:34:27: note: declaration of 'struct A<short int>'
 template <class T> struct A {
                           ^

タブを2つの空白に変換しているスクリプトは下記。

a.sh
#!/bin/bash
astyle -s2 -c < $1.cpp > $1s2.cpp
cat $1s2.cpp

検討事項

コンパイルエラーをなくす修正方法
役に立つまたは意味のある出力

参考資料

N4606 Working Draft 2016, ISO/IEC 14882, C++ standardのコード断片をコンパイルするためにしていること
https://qiita.com/kaizen_nagoya/items/a8d7ee2f2e29e76c19c1

コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da

Clang/Clang++(LLVM) gcc/g++(GNU) コンパイラ警告等比較
https://qiita.com/kaizen_nagoya/items/9a82b958cc3aeef0403f

Qiitaに投稿するCのStyle例(暫定)
https://qiita.com/kaizen_nagoya/items/946df1528a6a1ef2bc0d

MISRA C++ 5-0-16
https://qiita.com/kaizen_nagoya/items/7df2d4e05db724752a74

C++ Templates Part1 BASICS Chapter 3. Class Templates 3.2 Use of Class Template Stack stack1test.cpp
https://qiita.com/kaizen_nagoya/items/cd5fc49106fad5a4e9ed

ISO/IEC TS 17961:2013 C Secure Coding Rules(1) All list(to be confirmed)
https://qiita.com/kaizen_nagoya/items/54e056195c4f11b850a1

C言語(C++)に対する誤解、曲解、無理解、爽快。
https://qiita.com/kaizen_nagoya/items/3f3992c9722c1cee2e3a

C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識
https://qiita.com/kaizen_nagoya/items/d89a48c1536a02ecdec9

'wchar.h' file not found で困った clang++ macOS
https://qiita.com/kaizen_nagoya/items/de15cd46d657517fac11

Open POSIX Test Suiteの使い方を調べはじめました
https://qiita.com/kaizen_nagoya/items/644d5e407f5faf96e6dc

MISRA-C 2012 Referenceに掲載している文献の入手可能性を確認
https://qiita.com/kaizen_nagoya/items/96dc8b125e462d5575bb

どうやって MISRA Example Suiteをコンパイルするか
https://qiita.com/kaizen_nagoya/items/fbdbff5ff696e2ca7f00

MISRA C まとめ #include
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9

「C++完全理解ガイド」の同意できること上位10
https://qiita.com/kaizen_nagoya/items/aa5744e0c4a8618c7671

文書履歴

0.10 初稿 2080420