ボンジュール・マドモアゼル

本サイトの情報は自己責任にてご利用下さい。

[C++] 部分式の評価順序

 
C++ の理解し難い仕様。

部分式の評価順序は定義されていないのだと。

「プログラミング言語C++ 第2版」
3.2.2  評価順序
式の中で部分式を評価する順序は定義されていない。

int i = 1;
v[i] = i++;

は、 v[1]=1 と評価されるかもしれないし、v[2]=1 かもしれない。


「プログラミング言語C++ 第3版」
6.2.2  評価の順序
 式の内部に含まれている下位式の評価の順番は定義されていない。特に式が左から右へ評価されることを前提としてコードを書いてはならない。
引用はしなかったが、括弧を使えば強制的に評価順序を指定できるとあるので早速、
((cout << to_hex(n)) << " ") << to_hex(m) << endl;
としてみたが、相変わらず、to_hex(m) から評価されてしまう。。(コンパイラはgcc version 3.4.4)

[C++再考] 実行結果が異なるぞ

 
C++再考 [新装版] 第29章 アプリケータ、マニピュレータ、関数オブジェクト
P388
cout << to_hex(n) << " " << to_hex(m);
の文について
コンパイラはto_hex(n)を評価し、続いてto_hex(m) を評価するでしょう。
しかし、実際に実行してみたら、to_hex(m) が先に評価されている。(コンパイラはgcc version 3.4.4)

その理由は、次回に記す。

[C++再考] 配列の要素の次のアドレス

 
C++再考 [新装版] 第20章 反復子アダプタ
P270
CやC++では配列の要素の次のアドレスをつくることができるからです。つまり、a+10 は違法ではないのです。しかし、 a+11は違法です。また、a-1も違法なのです。

※int a[10]; とした場合
確認するため、「プログラミング言語C 第2版(訳書訂正版)ANSI規格準拠」を参照する。

A7.7 加法演算子
(中略)和が配列の限界の外を指すときには、終端の一つ先の最初の場所を除いて、結果は不定となる。

A7.9 関係演算子
演算子<(より小さい),>(より大きい),<=(小さいか等しい)>=(大きいか等しい)
(中略)一方、ポインタが配列の最後のメンバーを参照するときには、その比較は対応する添字の比較と同じである。Pが配列の最後のメンバーを指すときには、P+1がたとえ配列の外側を指すものであっても、P+1はPより高くなる。以上のいずれでもない場合には、ポインタの比較は定義されない。

付録A 参照マニュアルより



[C++] リファレンス型とオーバーロード

 
リファレンス型で関数オーバロードを試す。
void foo(int i){ }
void foo(int& i){ }

int main(){
        return 0;
};
これは問題なくコンパイルできた。
しかし、実際にこれらの関数を呼び出すと
void foo(int i){ }

void foo(int& i){ }

int main(){
int i;
foo(i);
return 0;
};

C:temp>g++ tmp3.cc

tmp3.cc: In function `int main()':
tmp3.cc:6: error: call of overloaded `foo(int&)' is ambiguous
tmp3.cc:1: note: candidates are: void foo(int)
tmp3.cc:2: note: void foo(int&)

曖昧な呼出しということでコンパイラが通らない。

そこで「プログラミング言語C++[第2版]」を参照。
任意の型 T について、T と T& では受理する初期設定子値の集合が同じであるため、引数型がこの点においてのみ異なる関数は、同じ名前を持ってはならない.例えば、

    int f(int i)

{
// . . .
}
int f(int& i) //エラー: 関数型の違いが充分でない
{
// . . .
}

(r.13 多重定義より)


初期設定子値の集合?
次の例を考えると int i, j は 即値(リテラル)を受け付けるのに対して、int& k は受け付けない。
初期設定子値の"集合"は異なるように思うが。。
int i = 1;
int j = i;
int& k = i;


どいうことだろうか。
その答えは多分、r.13.2 引数の一致 にある。
769頁
順序だけが異なる自明変換の列は区別できない。型T,const T,volatile T,T&,
const T&,及び,volatile T&の引数を持つ関数は,正確に同じ値集合を受理することに注意されたい.

[C++] デフォルトコンストラクタ

 
デフォルトコンストラクタは、クラスにコンストラクタ*が何も宣言されないときにのみ生成される。

*コピーコンストラクタを含む
次のページ