C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: const の使い方について


(過去ログ 72 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■42314 / inTopicNo.1)  const の使い方について
  
□投稿者/ 雲 (5回)-(2009/10/13(Tue) 06:11:48)

分類:[C/C++] 

以前のcpllメーリングリストで囚人さんが紹介してくれた、Demi を試しているのですが、Visual Studio 2008 において下記のコードがコンパイル出来てしまいます(必要なところのみDemiより抜粋)。

template<typename T>
class Test{
public:
 Test() : value(0){}
 operator const T& () const { return value; }

 T value;
};

int main()
{
 const Test<int> v;
 int &d = (int)v; // ←ここで、コンパイルエラーになって欲しい
}

なんで、const T& が T& 型に(暗黙に)変換されるのかが、全く、想像も出来ません(涙)。
何か大きな思い違いをしているのでしょうか?
引用返信 編集キー/
■42316 / inTopicNo.2)  Re[1]: const の使い方について
□投稿者/ 774RR (411回)-(2009/10/13(Tue) 07:11:45)
gcc だとコンパイルエラーになったよん
hoge.cpp:13: error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int'
VS2008 EE だとエラーにならないっすね

ある意味 VS2008 のバグと思っていいんぢゃないかな。
なぜエラーにならないのかも推測がつくけど。
引用返信 編集キー/
■42318 / inTopicNo.3)  Re[2]: const の使い方について
□投稿者/ επιστημη (2199回)-(2009/10/13(Tue) 08:55:30)
επιστημη さんの Web サイト
2009/10/13(Tue) 08:59:09 編集(投稿者)

> VS2008 EE だとエラーにならないっすね

VS2010βでもエラーにならんす。

const int a = 123;
int& b = (int)a;
だとエラー(↓こんなの)なのに。
error C2440: 'initializing' : cannot convert from 'int' to 'int &'

const int a = 123;
const int& b = (int)a;
これだとエラーにならん。へー。

引用返信 編集キー/
■42319 / inTopicNo.4)  Re[3]: const の使い方について
□投稿者/ 774RR (412回)-(2009/10/13(Tue) 09:09:08)
2009/10/13(Tue) 09:10:01 編集(投稿者)

VS2005 PRO でもエラーにならないっす。

提示ソースは C++ 文法解釈上いろいろと面白い(というと失礼か)ネタを抱えているので
blog 記事にするには格好の材料かと思われる。誰かやりません?

一時オブジェクトを const & で束縛することができる+寿命の延長ができる
一時オブジェクトを non-const & で束縛することはできない
→ VS2005/2008 はバグっているみたいだ<del>2010ベータ では直っている</del>

(type) のキャストの意味論的解釈
→この例は型変換関数を直接呼び出しているわけではなく static_cast になる

static_cast の意味論的解釈
→元オブジェクトとは異なる一時オブジェクトを作るんだぜベイベ
引用返信 編集キー/
■42323 / inTopicNo.5)  Re[4]: const の使い方について
□投稿者/ επιστημη (2200回)-(2009/10/13(Tue) 10:55:05)
επιστημη さんの Web サイト
2009/10/13(Tue) 10:58:53 編集(投稿者)

> (type) のキャストの意味論的解釈
> →この例は型変換関数を直接呼び出しているわけではなく static_cast になる

うんうんう。
const int a = 123;
const int& b = const_cast<int>(a);
だと「const int → int はペケあるよー」言うてくれますからねー
...おゃ?
const_cast は const の付け外しをすんだから、
ペケちゃうんちゃう?


引用返信 編集キー/
■42352 / inTopicNo.6)  Re[5]: const の使い方について
□投稿者/ 774RR (413回)-(2009/10/14(Wed) 08:52:48)
5.2.11 const_cast によれば const_cast<int> はできないことになっているので、それでいいはずだけど。
hoge.cpp:14: error: invalid use of const_cast with type `int',
which is not a pointer, reference, nor a pointer-to-data-member type

なおかつそもそも 7.1.5.1 で、
もともと const で定義されているオブジェクトを変更しようとする試みは未定義である
とあるのでやっぱりダメっす。
引用返信 編集キー/
■42353 / inTopicNo.7)  Re[6]: const の使い方について
□投稿者/ επιστημη (2201回)-(2009/10/14(Wed) 09:24:23)
επιστημη さんの Web サイト
あー、そかそか const hoge* や const payo& の const を外す/付けるのか > const_cast

引用返信 編集キー/
■42355 / inTopicNo.8)  Re[6]: const の使い方について
□投稿者/ 774RR (414回)-(2009/10/14(Wed) 09:43:08)
で、元発言者氏が出てこないが、納得できたのだろうか?

> なんで、const T& が T& 型に(暗黙に)変換されるのかが、全く、想像も出来ません(涙)。
結論は、この例の場合 const T& が T& に変換されているのではない、ということだ。

まず (int)v の文法的解釈だが、この場合 (int) という旧式キャストが static_cast に読み替えられ
static_cast<int>(v) であるものとして解釈される。
決して Test::operator const int &() const の呼び出しであるとは解釈されない。

次に static_cast の文法的解釈だが、記述 static_cast<T>(x) があるとき、
型 T において T tmpobj(x); という形式で呼び出せる(型変換)コンストラクタが呼び出せる場合に合法で
変換結果は上記 tmpobj つまり T を x で初期化した一時オブジェクトであるものとされる。
# あくまでも文法解釈上の話で、規格書に矛盾しない限り RVO してかまわない。

なので (int)v → static_cast<int>(v) → int tmpobj(v); で作られた tmpobj ということになり
これは元の v.value のコピーとなる。コピーだから元オブジェクト v.value の constness の影響を受けない。
# あくまでも文法解釈上の話で、規格書に矛盾しない限り RVO してかまわない。

最後に const& で一時オブジェクトを束縛することができるという規則に基づき
gcc: 一時オブジェクトを non-const& で保持しようとしている、というエラーになる
vc++:一時オブジェクトを non-const& で保持してもエラーにならない(-Ze 時の仕様っぽい)
ということで No42314 なり No42316 なりの結果となるわけだ。

vc++ 2005 ではコンパイルオプション -Za でエラーが出るようになるが、それではダメかいな?
引用返信 編集キー/
■42389 / inTopicNo.9)  Re[7]: const の使い方について
□投稿者/ 雲 (6回)-(2009/10/14(Wed) 21:45:24)
No42355 (774RR さん) に返信
> で、元発言者氏が出てこないが、納得できたのだろうか?

何となくは理解できるのですが、まだまだ、しっかり納得出来ているのかと言えば、そうではない感じ。なので、もう少し、考えさせてください。

ということで、一旦、解決済みとさせてください。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -