C++規格書のココを読め

このエントリーをはてなブックマークに追加
おならぷー
60山崎渉:03/01/13 18:26
(^^)
結局ひろゆきの年収っていくらなんだろう?
62山崎渉:03/01/15 17:51
(^^)
63山崎渉:03/01/23 22:23
(^^)
64デフォルトの名無しさん:03/03/02 03:01
結局どこを読めばいいのでしょうか
ぜんぶー
66山崎渉:03/04/17 16:01
(^^)
67山崎渉:03/04/20 03:58
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
68山崎渉:03/05/28 13:17
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
C 以外は糞
70デフォルトの名無しさん:03/06/16 11:17
何このスレ?
age2chの標準機能で荒らされてるみたいなんだけど
71(*゚Д゚):03/06/16 11:21
オナニーしちゃった。
72(*゚Д゚):03/06/16 11:28
じゃなかった・・・072ーだった。
73(=゚Д゚):03/06/16 11:30
C++ってなんすか?
74(*゚Д゚):03/06/16 11:43
バハムート改の事だよ…!!これで物知り博士の仲間煎り。
75デフォルトの名無しさん:03/06/16 11:44
C++を理解できない奴はこうやって荒らしたりするのか。
なるほど、勉強になる。
76(*゚Д゚):03/06/16 11:47
授業料没収します…
77デフォルトの名無しさん:03/06/16 17:20
誰かあの長々とした英文を翻訳してください。
って無理だわな。
英語も勉強しないと。
783 ◆zz/Ed1ynRo :03/06/26 17:25
>>46
同意

ところで、携帯ゲーム機"プレイステーションポータブル(PSP)

 このPSPは、新規格UMD(ユニバーサルメディアディスク)というディスクを利用しており、そのサイズは直径6cmととても小さい(CDの半分程度)。 容量は1.8GBとなっている。
画面は4.5インチのTFT液晶で、480px x 272px(16:9)。MPEG4の再生やポリゴンも表示可能。外部端子として、USB2.0とメモリースティックコネクタが用意されているという。

この際、スク・エニもGBAからPSPに乗り換えたらどうでしょう。スク・エニの場合、PSPの方が実力を出しやすいような気がするんですが。
任天堂が携帯ゲーム機で圧倒的なシェアをもってるなら、スク・エニがそれを崩してみるのもおもしろいですし。かつて、PS人気の引き金となったFF7のように。

いきなり変なこと書いてスマソ‥‥
GBAと比較してみてどうですかね?(シェアのことは抜きで)
79山崎 渉:03/07/15 10:50

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
80山崎 渉:03/07/15 14:03

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
81山崎 渉:03/08/02 02:52
(^^)
82山崎 渉:03/08/15 17:55
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
[]で囲まれたものはキーワード。(opt)はオプション。つまり無いこともあると。

A.12 Templates

template-declaration:
[export](opt) [template] < template-parameter-list > declaration

template-parameter-list:
template-parameter
template-parameter-list, template-parameter

template-parameter:
type-parameter
parameter-declaration // プリミティブ型のことか? template <int int_t>

type-parameter:
[class] identifier(opt)
[class] identifier(opt) = type-id
[typename] identifier(opt)
[typename] identifier(opt) = type-id
[template] < template-parameter-list > class identifier(opt)
[template] < template-parameter-list > class identifier(opt) = id-expression
// id-expressionというのはここでいうtype-id(はっきりしている型)
// が求まる式という意味なのだろうか?
template-id: //汎関数、汎クラスの名前+汎パラメタ実引数をひとまとめにしたもの
template-name < template-argument-list(opt) >

template-name:
identifier

template-argument-list:
template-argument
template-argument-list, template-argument

template-argument:
assignment-expresion //これはなんだ?代入式って?
type-id
id-expression


explicit-instantiation:
[template] declaration
// 汎関数、汎クラスの複数回インスタンス化防止。コンパイラへの優しさ。

explicit-specialization: // 完全特殊化
[template] < > declaration
// specializationとは型パラメタに応じて一つ以上定義部を設けること。
ANSIC++のgrammarだけはここで見れる
http://www.csci.csusb.edu/dick/c++std/cd2/gram.html
C++相談室から拾ってきた。こっちには規格書全部含まれてる。
http://www.kuzbass.ru/docs/isocpp/
87デフォルトの名無しさん:03/10/07 18:15
14 - Templates [temp]

-1- A template defines a family of classes or functions.
template-declaration:
export[opt] template < template-parameter-list > declaration
template-parameter-list:
template-parameter
template-parameter-list , template-parameter

The declaration in a template-declaration shall
* declare or define a function or a class, or
* define a member function, a member class or a static data member of a class template
or of a class nested within a class template, or
* define a member template of a class or class template.

A template-declaration is a declaration. A template-declaration is also a definition if
its declaration defines a function, a class, or a static data member.

テンプレート宣言の宣言は
* クラス又は関数の宣言、定義する

* 1)メンバ関数、2)メンバクラス、又は3)クラステンプレートのスタティックメンバ、
4)クラステンプレートにネスト宣言されたクラスのスタティックメンバ を定義する。

* クラス又はテンプレートクラスのメンバテンプレート(クラス、関数)を定義する。

この辺りはちょっと具体例がないので分り難い。
Static Data Memberがこのぐらいの抽象度の説明で出てくるのは印象ぶかい。
-2- A template-declaration can appear only as a namespace scope or class scope
declaration. In a function template declaration, the declarator-id shall be a
template-name (i.e., not a template-id). [Note: in a class template declaration, if the
declarator-id is a template-id, the declaration declares a class template partial
specialization (temp.class.spec). ]

(tenplate-declarationとは関数テンプレート、クラステンプレートを人まとめにしたもの)
テンプレート宣言は{namespace scope,class scope}にだけapearする。
つまり関数内ではダメですよ、ということらしい。union内ではどうなのだろうか?

関数テンプレート宣言においては、declarator-idはtemplate-nameとなる。
declarator-id
template-id
template-name
これらの文法内での意味は保留。

クラステンプレート宣言内において、declarator-idとtemplate-idなら、
その宣言はクラステンプレートの部分的特殊化となる。

部分的特殊化はLOKIなどで活用されてるので分りやすい。
問題は、文法用語のこと。とりあえず、declarator-idとtemplate-idが同じなら
テンプレートの部分的特殊化と見なしてよいということ。
まあクラステンプレートの名前のことだと思うけど。
-3- In a template-declaration, explicit specialization, or explicit instantiation the
init-declarator-list in the declaration shall contain at most one declarator. When such
a declaration is used to declare a class template, no declarator is permitted.

8章をみるとdeclaratorについてはこう書いてある
A declarator declarares a single object, function, or type within a declaration.
Init-declarator-list appearing in a declaration is a comma-separated sequence
of declarators.
つまり宣言文のなかで、宣言される一つ以上の対象のことらしい。


template-declarationという集合の中の、
完全特殊化と、explicit instantiationについて書いてある。
ここは分り難い。most one declaratorとは何のことなのか?
なんのことなのか分らん。英語力が足りない。
>>84
> template-argument:
> assignment-expresion //これはなんだ?代入式って?

定数値を取るテンプレート( template<int N> class array とか )に対する引数。
中に array< 1==2 ? 3 : 4+5*6 > と式を書いても構文上は構わんので。
# ここは本当は conditional-expression であるべきだとは思うんだけど。
>>89
> most one declaratorとは何のことなのか?
「at most one declarator」。
最大でも一つの宣言子。
>>90-91
赤ペン先生ありがとうございます。
英語力、C++対する理解ともにかなり怪しいので助かります。
-4- A template name may have linkage (basic.link). A template, a template explicit
specialization (temp.expl.spec), or a class template partial specialization shall not
have C linkage. If the linkage of one of these is something other than C or C++, the
behavior is implementation-defined. Template definitions shall obey the one definition
rule (basic.def.odr). [Note: default arguments for function templates and for member
functions of class templates are considered definitions for the purpose of template
instantiation (temp.decls) and must also obey the one definition rule. ]

テンプレート名はリンケージを持つかもしれない。

テンプレート(そのもの??)、テンプレートの完全特殊化、
又はクラステンプレートの部分的特殊化はCリンケージを持つことはない。

もし、CかC++以外のなんらかのリンケージがひとつあるなら、
その動作はimplement-defined(実装依存?)である。

テンプレートの定義はひとつの定義ルールに従う。

関数テンプレートとクラステンプレートのメンバー関数のデフォルト引数は
テンプレートのインスタンスを目的とした定義と考えられ、また
ある一つの定義ルールに従わなければなりません。
definition ruleというのが3.2に書いてあるが、難しいのでパス。
-5- A class template shall not have the same name as any other template, class,
function, object, enumeration, enumerator, namespace, or type in the same scope (
basic.scope), except as specified in (temp.class.spec). Except that a function template
can be overloaded either by (non-template) functions with the same name or by other
function templates with the same name (temp.over), a template name declared in namespace
scope or in class scope shall be unique in that scope.

クラステンプレートは他のテンプレート、クラス、関数、オブジェクト、enum{型,宣言子}、
namespace、同一スコープにある型と同じ名前を持つことはない。
いくつかの例外はtemp.class.specを見ろと。

テンプレート関数がテンプレート関数、非テンプレート関数の両方に対して
オーバーロードできることを除けば、テンプレートはクラススコープ、ネームスペース
においてユニークな名前で宣言される。


このクラステンプレートにおける例外が曲者っぽい。
何かを説明するときに対象の特徴を元にリストを挙げるわけだけど、リストの全てとは
// class
{名前空間,クラス{,テンプレート},関数{,テンプレート}}内のクラス{,テンプレート}
// function
{クラス{,テンプレート}のメンバとしての,名前空間内の}{,インライン}関数{,テンプレート}

というかんじでしょうか。存在するスコープと属性を元にリストアップ。
一覧が見たい人は、for str in 上の文字列;do echo $str;done
とでもしてみてください。
クラスに関しては10通り。関数に関しては12通り。まだまだあるかもしれません。

仕様書において、関数やクラスの特徴をそのたびごとにずらずらと並べられているのは
分り難いと思いました。一度全ての組み合わせを用いられるケースとは別に挙げて
しまう方が分りやすいかと。
-6- A namespace-scope declaration or definition of a non-inline function template, a
non-inline member function template, a non-inline member function of a class template or
a static data member of a class template may be preceded by the export keyword. If such
a template is defined in the same translation unit in which it is declared as exported,
the definition is considered to be exported. The first declaration of the template
containing the export keyword must not follow the definition.

1)名前空間スコープでの非インライン関数テンプレートの宣言、定義、
2)非インラインのメンバー関数テンプレート
(ただのメンバーというのは非テンプレートのクラスのメンバという意味らしい)
3)非インラインのクラステンプレートのメンバー関数
4)クラステンプレートのスタティックデータメンバ
これらはexportキーワードにより優先されるかもしれない。
何に対して優先されるのか?

もし、exportとして宣言されるそのようなテンプライズされたクラスや関数が
同じ変換ユニット内で定義されるなら、その定義はexportされる。

exportキーワードを含むテンプレートの最初の宣言(最初でない宣言とは?)は
定義に従ってはいけない。


exportについて説明しているのだけど、separation compilationは当分は
使えないだろうからパス。Inclusion compilation最強。
-7- Declaring a class template exported is equivalent to declaring all of its non-inline
function members, static data members, member classes, member class templates and
non-inline function member templates which are defined in that translation unit
exported.

exportされるクラステンプレートを宣言することは、
1)非インラインメンバ関数
2)非インラインメンバ関数テンプレート
3)スタティックメンバデータ
4)メンバクラス
5)メンバクラステンプレート
変換ユニットで定義されるこれらの全てがexportされることと同等である。

つまり、あるクラステンプレートがexportされたら、そのクラスの1-5の要素は
全てexportされると。

一般にexportの難しさは

foo.h  テンプレート宣言
foo1.c  テンプレート定義(export指定)
foo2.c  テンプレートのインスタンス化
という関係があるとき。foo1.cにおいてexportされた定義がfoo2.cにおいて
参照できるかできないか。Cでは通常inline関数はヘッダファイルに書くものだが、
C++では他の*.cppつまりオブジェクトファイルに入れておけるということなのかな??
-8- Templates defined in an unnamed namespace shall not be exported. A template shall be
exported only once in a program. An implementation is not required to diagnose a
violation of this rule. A non-exported template that is neither explicitly specialized
nor explicitly instantiated must be defined in every translation unit in which it is
implicitly instantiated (temp.inst) or explicitly instantiated (temp.explicit); no
diagnostic is required. An exported template need only be declared (and not necessarily
defined) in a translation unit in which it is instantiated. A template function declared
both exported and inline is just inline and not exported.

無名名前空間で定義されたテンプレートはexportされない。
テンプレートはプログラム中でたった一度だけexportされる。
実装においては、これらのルールを破ることでメッセージ表示をする必要はない。
特殊化でもexplicitly instantiatedでもない非exportテンプレートは、
暗黙的、明示的インスタンス化される全ての変換単位において
宣言されていなくてはならない。
exportされるテンプレートは、インスタンス化される変換単位において
宣言だけされることを必要とする。
exportかつインラインとして宣言される関数テンプレートは、
インラインではあるあg、exportはされない。
-9- [Note: an implementation may require that a translation unit containing the
definition of an exported template be compiled before any translation unit containing an
instantiation of that template. ]

実装によっては、exportされたテンプレートが定義された変換単位が、
インスタンス化される変換単位より、先にコンパイルされていなくては
ならないかもしれない。


とここまでわけもわからず読んでみて、exportはコンパイラの実装と、
言語的な仕様の板ばさみ状態で分り難い。通常、多くのテンプレートライブラリが
Includsion compilationでの仕様を前提としているので、この14はさらっと
概要だけ分ればいいのかな。
むしろ、exportは全てのテンプレートに絡んでくるから、
何度でもこの14 -*-を読まないとダメか。
>>87-100
突然、何だったんだ?
>>101
英語の勉強とテンプレートの仕様と駄スレの再利用が目的でした。
14章の頭しか読んでませんが、それでも年内に最後まで読みたいです。
どうか見逃してやってくださいm(__)m
>>102
なんとなく面白かったので再開する気ありませんか?
104名無しさん@Vim%Chalice:04/01/20 01:39
再開期待age
105デフォルトの名無しさん:04/01/20 03:27
ISO/IEC 14882:2003のPDFを無料で落とせるURLを
教えて下さい。
>>105
確かに ISO の方だとちょい高すぎだが、ANSI(>>10)の方だと $18 で買える。
つか、今購入してDL中だ(w
107!240:04/03/12 02:38
C++相談室 part28
http://pc2.2ch.net/test/read.cgi/tech/1077985164/240

|18.4.1.3
|1 These functions are reserved, a C++ program may not define functions
| that displace the versions in the Standard C++ library (17.4.3).

となっているため、以下の関数を置き換えることはできない。

void* operator new(std::size_t size, void* ptr) throw();
void* operator new[](std::size_t size, void* ptr) throw();
void operator delete(void* ptr, void*) throw();
void operator delete[](void* ptr, void*) throw();
108!240
一方で

|18.4.1.1 2,6,11 / 18.4.1.2 2,6,10
|Replaceable: a C++ program can define a function with
| this function signature that displaces the default
| version defined by the C++ Standard library.

となっているので、以下の関数は置き換えが可能である。

void* operator new(std::size_t size) throw(std::bad_alloc);
void* operator new(std::size_t size, const std::nothrow_t&) throw();
void operator delete(void* ptr) throw();
void operator delete(void* ptr, const std::nothrow_t&) throw();
void* operator new[](std::size_t size) throw(std::bad_alloc);
void* operator new[](std::size_t size, const std::nothrow_t&) throw();
void operator delete[](void* ptr) throw();
void operator delete[](void* ptr, const std::nothrow_t&) throw();