【C++】 const だけでメシが3杯食えちゃうスレ
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNG0004デフォルトの名無しさん
NGNG「値が変わらないよ」って意味だといいんですが…。
0005デフォルトの名無しさん
NGNGからむと ちとかわる
0006デフォルトの名無しさん
NGNG0007デフォルトの名無しさん
NGNG0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNGconst 書く場所による
0010デフォルトの名無しさん
NGNGTest( const Test &hoge )
と書いてあるときのconstは何の意味があるんですか?
0011デフォルトの名無しさん
NGNGhogeは変更しないよって意味
hogeは書き換えちゃダメよって意味
でもデータメンバが全部mutableだったらたぶん意味ないよって意味
0012デフォルトの名無しさん
NGNG0013デフォルトの名無しさん
NGNGmutableは一度も使ったこと無いな。
存在自体を忘れていた。
001410
NGNGう〜ん。なるほど。
つまり、代入元となるhogeを保護するために付けるんですね。
でもコピーコンストラクタが呼ばれた時にhogeが書き換えられる
危険性ってあるんですかね〜?
0015デフォルトの名無しさん
NGNG呼び出す側が、引数として渡されるオブジェクトを変更しないという保証のため
const string a("CONST");
に対し、
string b(a);
が使えるかが問題。
(bを変更するかどうかは、この場合問題にはならない)
0016デフォルトの名無しさん
NGNGってなによ?
0018デフォルトの名無しさん
NGNGfoo()は変更を伴う操作を行わない
0019デフォルトの名無しさん
NGNGちょっとわかりにくかったけど、要は
呼び出し側の都合でconstなものしか渡せない場合があるってこと。
その場合でもエラーにならないようにするには
引数をconstとして宣言するしかない。
それと、引数が const & の場合
暗黙の型変換が適用できる(される)というのもある。
0020デフォルトの名無しさん
NGNGconstなインスタンスでも使えるようにする。
struct Foo {
void foo() { std::cout << "foo"; }
};
struct Bar {
void bar() const { std::cout << "bar"; }
};
const Foo foo;
const Bar bar;
foo.foo(); // error
bar.bar(); // OK.
0021デフォルトの名無しさん
NGNGconst宣言すると外部からアクセスできないけど、内部でもう一回const宣言
してあるとアクセスできるようになるというのは仕様と考えればいいんですか?
0022デフォルトの名無しさん
NGNGconst宣言してあるオブジェクトは変更できないから
変更する可能性のあるメンバー関数を使うことは出来ないけど
constなメンバー関数は自信を変更しないことを保証しているから
constなオブジェクトから使うことが出来る。
それだけのこと。
0023デフォルトの名無しさん
NGNG0024デフォルトの名無しさん
NGNG0025デフォルトの名無しさん
NGNGT const
T const &
T * const
T * cosnt &
T const *
T const * &
T const * const
T const * const &
( & const はコンパイラが警告を出すので除外 )
0026デフォルトの名無しさん
NGNGtemplate< typename T >
struct add_const { typedef T const type; };
template< typename T >
struct add_const< T const > { typedef T const type; };
template< typename T >
struct add_const< T & > { typedef T const & type; };
template< typename T >
struct add_const< T const & > { typedef T const & type; };
0027デフォルトの名無しさん
NGNGstruct remove_const { typedef T type; };
template< typename T >
sturct remove_const< T const > { typedef T type; };
template< typename T >
struct remove_const< T const & > { typedef T & type; };
0028デフォルトの名無しさん
NGNG2、4番目の特殊化は要らないんじゃないか?
0029デフォルトの名無しさん
NGNG0030デフォルトの名無しさん
NGNGT const const って T const になるんだけっか。
だとすれば確かにいらないね。
0032デフォルトの名無しさん
NGNGvoid foo() const { }
になるんでつか?
0033デフォルトの名無しさん
NGNG0034デフォルトの名無しさん
NGNGclass Hoge {
...
void foo() const;
...
};
void Hoge::foo() const { ... }
でも可。
0035デフォルトの名無しさん
NGNGconstつけられるところには必ずつける癖をつけてるんだけど・・・
0036デフォルトの名無しさん
NGNG0037デフォルトの名無しさん
NGNGコンパイルエラーで弾く意図があるんですが・・・やりすぎですか?
0038デフォルトの名無しさん
NGNG自分がポカミスしないために const つけてます。
高速化目的等にも役に立つけれど、主な目的はバグ防止だよね。
コンパイル段階で弾けるエラーが増えるとというのはデバックが短時間化できていいよ。
最近は、これの派生でテンプレートを使ったコンパイルタイムアサートも気に入っている。
こちらはかなり自由度高いし。
0039デフォルトの名無しさん
NGNG>あ,返り値の一時変数に代入するような意味のない記述を
ごめん、意味がわからない。
↓みたいな意味なんだったら const なくてもエラーが出るが?
int getlval(void);
getlval() = 3;
0040デフォルトの名無しさん
NGNGf() = f();
0041デフォルトの名無しさん
NGNGint const * const * const * const * const * const * const * const * const
0042デフォルトの名無しさん
NGNGナニコレ(つД`)キモイヨー
0043デフォルトの名無しさん
NGNG0044デフォルトの名無しさん
NGNGしかしこれも正当な型なんだよな.
まぁ,こんなのを実際のコードで見た日には食ったメシも吐いちまうが
0045デフォルトの名無しさん
NGNG0046デフォルトの名無しさん
NGNG時々も出来るかヴォケ。
漏前はツリーの深さを最初から決め打ちにするのかと小一(ry
unionでも勉強しろ。
0047デフォルトの名無しさん
NGNG0048デフォルトの名無しさん
NGNGメンバ関数ポインタだの、配列を返す関数だののプロトタイプはショック死しそうだ。
それよりもキツイのが boost::lambda とかのプログラムから自働生成される型とかタイプリストとか
0049デフォルトの名無しさん
NGNGそういうときにふとmutableの存在を思い出したりもするし。
0050デフォルトの名無しさん
NGNG配列を返す関数はダメなの?
vectorやbasic_stringを返す関数はどう?
0051const至上主義
NGNGみんな const だ〜♪
世界に広げよう〜♪
const の輪〜♪
0052デフォルトの名無しさん
NGNGポインタを渡したり、参照を返す関数書いたりするようなときな。
ふと気づいたら、JavaとかC#とか、C++の後に出た言語は、
全て上で書いたようなconstが無くなってたのはショックだった。
どうして、無くなったのかだれか説明してください
0053デフォルトの名無しさん
NGNG0054デフォルトの名無しさん
NGNG0055s
NGNG0056デフォルトの名無しさん
NGNG0057s
NGNGちなみにJavaのfinalなら使えないよ...
0058デフォルトの名無しさん
NGNG何で?
0059デフォルトの名無しさん
NGNG006052
NGNGfinalは変数が初期化された後更新されないことを保証する機能で、
変数が指すオブジェクトが更新されないことは保証しないから。
class Bar;
class Foo {
private: Bar mObj1;
public: Bar & Obj1() const {
return mObj1;
};
}
みたいのと等価なコードはfinalでは書けないでしょ。
ここでポイントは、
・mObj1がFooの利用者から全く更新されないことを保証できること
・publicなメンバ変数と同様にObj1()がmObj1を指していること
・Fooの内部からはmObj1を好き勝手に変更できること
かな。
って良く考えると、これもいろいろと抜けがあるなぁ。
Obj1()のポインタをとればmemcpyとか使って更新できるし、
どっか他で捕まえておかれる可能性を考えればFooの内部であんまり好き勝手
できないだろうし・・・
もしかしてこういう可能性を考えると、constが無意味になるから無くしたとか・・・
0061デフォルトの名無しさん
NGNGconst Bar & Obj1(){ ですか?
0062s
NGNGそういうことさね.>>60の
>Obj1()のポインタをとればmemcpyとか使って更新できるし
というのは嘘.
つまり>>61のように,const Bar& Obj1() とやれば,
ポインタ取るときもconst*しか取れないのだ.
const_castしないとmemcpyで書き込めない.
∴const最高.
でもうっかり書き忘れると痛いときもある.STL使ってる時,特に…
Javaで導入されなかったのはまぁ許すとして,
Dに導入されなかったのはちょっといやだ.
006360
NGNGそもそも自分の疑問は、どうしてconstが無くなった言語が多いのか
ってことなんですが。
C++のconstの有害性みたいのを、ぐぐったりしてるんですが、
納得のいく理由が見つかりません。自分は上で間違いを色々書いたわけで、
そういう誤りを減らすためとか言われると、それまでですが。
やっぱり「馬鹿に配慮したから。」なのかなあ・・・
0064デフォルトの名無しさん
NGNGttp://www.digitalmars.com/drn-bin/wwwnews?D/15187
ここ一通り読んでみると面黒い鴨よ。
0065デフォルトの名無しさん
NGNG> 1) Too complicated (look at all the wierd rules and perterbations it causes
> with template specialization and overloading).
> 2) Too confusing.
> 3) Insufficient utility.
> 4) Optimizers can't reliably use the info anyway.
> 5) Ugly.
一言で言うと、書いた人以外には解りにくいコードになるってことですかね?
0067デフォルトの名無しさん
NGNG0068デフォルトの名無しさん
NGNGclass Foo{
private Bar mObj1 = new Bar();
Bar Obj1(){
return mObj1;
}
}
こんな感じ?
でも、ポインタのないJavaだと、
外からFoo内のmObj1の参照先を変えられなくないですか?
0069デフォルトの名無しさん
NGNGみたいのを禁止したいって話です
0070デフォルトの名無しさん
NGNG0071s
NGNG・関数の引数はデフォルトでconst参照,
・メンバ関数はデフォルトでconstメンバ関数,
…などとするのはどうか.
constとは逆の, "mutable" とゆうキーワードを導入して.
…あれ?
0072デフォルトの名無しさん
NGNGどう形を変えても。
うかつにオブジェクトの参照を渡せないっていうのも困りものって気はする
わけだが。
007360
NGNGありがとうございます。なんとなく斜め読みしました。
const廃止が納得できました。
コンパイラ作るのがだるいとか最適化の問題は、自分の興味からは外れるので置いておいて。
const付いてると使いにくいって言うのは、プログラマの質の問題だから置いておいて。
type modifierという発想自体、uglyなものというのが納得できました。
読み取り専用にしたかったら、専用のInterfaceを用意するのが、smartな解決法ですね。
#実際にやるとなると、死ぬほど面倒そうですが・・・
例えば関数のパラメータなんかで、constにして渡したい場合なんかは別ですが、
これもtype modifierとして読み取り専用を保証するのではなく、DBCの様な概念で不変表明として表現する方が、
確かに高機能で且つ一貫性もあり良いんですね。
(まあ、Dにはin,out,inoutで引数を修飾する機能がありますが)
↑こんな理解にたどり着きました。
おかしいところ多々あると思いますので、よろしければご指摘ください。
#でも、constは便利なんだよなぁ・・・
0074デフォルトの名無しさん
NGNG>読み取り専用にしたかったら、専用のInterfaceを用意するのが、smartな解決法ですね。
俺は const は constのT型を自動的に生成してくれる機能だと思ってるのだが…。
つまり type modifier ではなく、読み取り専用の interface をもった型を自動生成してくれるのが const じゃないのか?
0075デフォルトの名無しさん
NGNGところで const をつけようがつけまいが、動作は変わらない。
だから読む側(動作を理解する側)からすれば、無いほうが読みやすいに決まっている。
そこで読みやすさを求めれば const を取り除くのは、目的を達成しているから正しいが、
それと同時にプログラムの信頼性を捨てているというのが問題。
const にあたる機能は絶対に必要と思うんですが、const は型にすべきでは無いには賛成。
D の取った方針は片端だと思う。
0076デフォルトの名無しさん
NGNGローカル変数の const はコードを明解にしてくれることが多いと思っている。
初心者のよくやる変数の使いまわしも起こり得ないし、
値に対する名前のふさわしさも、初期化さえ確認すればあとは信頼できることになる。
007773
NGNG読み取り専用のinterfaceを自動生成する機能を追加することで、
type systemが破綻をきたすんじゃないかという懸念で、
最近の言語はconstを捨てたのかな、
と考えたわけです。
いまいち自分でもこの辺の理屈がよくわからないので、もう少し考えてみます。
>>75
constは型にすべきではないならば、どういう方法になるのでしょうか?
表明として表現しておいて、その表明をチェックする賢いコンパイラを作るのが良いのか、
あるいはもっと別の方法をお考えなのか。。。
よろしければお聞かせください。
#べつに言語を作りたいわけじゃないんですけどね・・・
0078デフォルトの名無しさん
NGNG0079デフォルトの名無しさん
NGNGいや、ふつうだろ。
0080デフォルトの名無しさん
NGNGポインタ型って言わないか?普通
0081デフォルトの名無しさん
NGNGよかった、俺だけじゃなくって
0082デフォルトの名無しさん
NGNG0083デフォルトの名無しさん
NGNGってことは全部のメンバ関数にconstをいちいち付けないといけないの?
オブジェクトを非constにする場合も考えて非const版の全く同じ関数も書くの?
随分ねんどくさいんだね
0084デフォルトの名無しさん
NGNG0085デフォルトの名無しさん
NGNG書くとき面倒かデバッグするとき面倒かで決めなさいって事
0086デフォルトの名無しさん
NGNG非constオブジェクトからconstメンバ関数は呼べる。
ただ、例えば、
「constイタレータを返すconstメンバ関数」
「非constイタレータを返す非constメンバ関数」
を両方用意しないといけないのは確かに面倒かも。
0087デフォルトの名無しさん
NGNGconstのインスタンスに対しても呼び出したいメンバ関数は全部constを付ける。
当然メンバ変数の変更はできなくなる(mutable以外)が、
それは考えてみればあたりまえでしょう?
constの時と非constの時でどうしても振る舞いを変えたい時だけ
const版と非const版を別に用意する。
実際、クラスの設計が破綻してなければ、ほとんどの場合は別に用意する必要はないと思われ。
0088デフォルトの名無しさん
NGNGクラスの参照を直接返してもらうインライン関数を多数用意したほうが
その後の拡張なんか考えても理にかなってることって多いと思うんだけど、
そうなると大抵、同名の const 関数と 非const 関数がズラズラ並ぶことになるな。
メソッドとしての性格がはっきり読み取れるようになるので、
俺としては逆に好みのスタイルなんだけど…。
0089デフォルトの名無しさん
NGNGこれだけでもかなりハァ?な感じだが、
>>クラスの参照を直接返してもらうインライン関数を多数用意したほうが
これも、メンバの参照を直接返すってコトか?
そんな実装を直接晒すクラス設計はお話にならん。
実装の詳細が変わったらクライアントコードみんなあぼーんか。めでたいな。
0090デフォルトの名無しさん
NGNGちょっと感動した。
そのとーりだな・・・反省
0091デフォルトの名無しさん
NGNGこの二つだけでどんぶり飯4杯は軽いです。
0092デフォルトの名無しさん
NGNG今時C++でそんなもん使うかな?
0093デフォルトの名無しさん
NGNG0094デフォルトの名無しさん
NGNG0095デフォルトの名無しさん
NGNGクライアントからは関係のない、実装の詳細内で使うような
プリミティブ型やstructに近い性格のクラス(例えばベクトルクラス)
なんかではありだと思うけどな。
vec.x() = 0.1f;
みたいな感じで。
個人的には、アクセサなのかマニピュレータなのか分かりづらいから
好きではないけど、publicのメンバに比べたら、assertしかけたり例外投げる
余地がある分マシじゃない?
>>94
逆に、どういう時に使うの?
ハンドルとかのクラスの状態変数に使ったことがあるくらいだなぁ。
0096デフォルトの名無しさん
NGNG0097デフォルトの名無しさん
NGNGmutable は、外側から見たクラスの挙動を変えずに、コードの性能を改善するための最終兵器…かな?
例えば、線形の検索が頻発するリストがあったとして、直前の検索結果を
次の検索の高速化のためのキーに使えそうなら、おもむろにメンバに
mutable int _index;
とかを追加して、次回の検索に役立てると。
普通この手の話は、アルゴリズム自体を改善しろよとか、
使えそうなキーがあるなら外部からも取得できるようにして
呼び出し側が指定できるようにしろよとか、そんな腐った設計の仕事に
関わりあいたくないとか言われてしまえば、そこでお終いになるわけだが、
あまり考えたくない諸般の事情…
・何らかの(政治的含む)事情により、他のコードに手を出すわけにいかない
・もう時間が残っておらず、大きな改修をくれている暇が無い
・このクラス単体の性能が上ることで、誰も不利益を被らない
なんかによって八方塞りなんだけど、なんとか目標の性能を達成したい時とかには、重宝したりしなかったりします。
あとの使い道は…参照カウンタ類とか。
これはデバッグビルド時、あまりリッチな開発環境を使えなかったり、プロファイラなんかが
役に立たない時に、やはり外側の挙動を変えずに、ナニが何回呼ばれて何秒使ってるとか
局所的なチェックを入れたい時に、役に立ったり立たなかったり。
const 参照しか返してないのに、明らかに非constメソッドに接触されていて、
どこが原因か追っかけ倒したら>>93が悪の華を咲かせてたりとか、そういう事態に対する
自衛手段になることもあったりなかったり。
自制して使えば、それなりに出番も持たせられる、そこそこ便利な機能だと思うよ。
C++のこういう泥臭くって現実主義的なところ、俺は好きです。
0098デフォルトの名無しさん
NGNG俺は嫌いです。
デバッグビルド時に論理的にちゃんと動いているかチェックする目的以外で
mutable は使わない/使わせない。
特に
・何らかの(政治的含む)事情により、他のコードに手を出すわけにいかない
・もう時間が残っておらず、大きな改修をくれている暇が無い
これは最低だろ。
政治的理由の場合はラッパーで包んだり、馬鹿避けの仲介オブジェクトを挿んだりして
なんとかするのが唯一のまともな解法だと思う。
時間が残っていないのはもうどうしようもないけど、
予防策はユニットテストだろうか。
・このクラス単体の性能が上ることで、誰も不利益を被らない
これ意味わかんない。
0099デフォルトの名無しさん
NGNG>>98
>予防策はユニットテストだろうか。
なぜ?
>・このクラス単体の性能が上ることで、誰も不利益を被らない
>これ意味わかんない。
なぜ??
お前、"デザパタ"だの"XP"だのと並べ立てて他人を非難する
某言語厨とそっくりだぞ。
0100デフォルトの名無しさん
NGNG大きな数値のコンテナで数値の平均を保持する変数をmutableで,とか.
その数値が有効かどうかのmutable boolとセットで.
010198
NGNG>>99
まあキミが97ではないという事にしておいてあげるけど
クラス単体の性能が上ることで、誰も不利益を被らないクラスのメンバは
mutable キーワードを使ってよい。
って意味わかんないんですけど。
mutable って const_cast と同じ種類の危険性をはらんでるってわかってるかな?
>>予防策はユニットテストだろうか。
>なぜ?
#もう時間が残っておらず、大きな改修をくれている暇が無い
なら、大きな改修をする必要性がなくなればいいわけで、
ユニットテストは(その効能が事実であるならば)有効でしょう。
0102100
NGNGC++のconstは「bitが変更されない」,という意味のkeywordで,
これはしばしば「objectが変更されない」というsemanticsと異なるときがある.
この差異を吸収する機構としてmutableがある,と漏れは思っていたんだけど.
010398
NGNG>>99
>お前、"デザパタ"だの"XP"だのと並べ立てて他人を非難する
>某言語厨とそっくりだぞ。
某言語厨が何故C++使いを叩くのかわからなかったけど、
俺が叩かれてたわけじゃなかったんだとわかったよ。
デザパタもXPも有効なら覚えればいい、使えばいい。
自分が理解できた事以外はみんな有害って事にしちゃう君は
未だに構造化とか言いながらグローバル変数を肯定してる
某言語厨とそっくりだぞ。
010498
NGNG>C++のconstは「bitが変更されない」,という意味のkeywordで,
>これはしばしば「objectが変更されない」というsemanticsと異なるときがある.
あなたの>>100での例で言えば、
クラスの責任と役割を分割しきれていないんじゃないかと思う。
平均値が必要なら、専用のクラスに別ければいいじゃない。
コンテナが平均値数える必要はないと思うんだけど。
mutable はどうしようもない矛盾を解決するための手段だと思うけど、
mutableを乱用する人は、解決可能な矛盾までうやむやにしていると思う。
0105デフォルトの名無しさん
NGNG100の例はあまり適当ではないですね.
100の例は,数値の平均を取る操作をobjectにまで引き上げるかどうかは
議論の余地が大いにありますし.
ただ,objectに引き上げる場合も数値コンテナが変更されるたびに
平均値オブジェクトに変更を通知しなければならず,データの一貫性という点で
弱点をはらんでいるとは思います.
010698
NGNG>データの一貫性という点で弱点をはらんでいる
別にデータが重複しているわけではないのだから、
バグなら潰すのみ。
マルチスレッドにおける問題ならば、内包していようが外に出ていようが
そこに問題があるのは一緒だと思うけど。
0107デフォルトの名無しさん
NGNGgetterメソッド呼ばれるたびに、clone するの、激しくマンドクセーし。
new とか clone って遅いらしいので、精神衛生上にも良くない。
0108デフォルトの名無しさん
NGNG"俺は>>97でではないが…。"
なんてバレバレな書き込みする自作自演がいるかっつうの。
何であの文脈で
>・このクラス単体の性能が上ることで、誰も不利益を被らない
を
>クラス単体の性能が上ることで、誰も不利益を被らないクラスのメンバは
>mutable キーワードを使ってよい。
と読むんだ。>>97が書きたかったのは
・(キャッシュ等の目的でmutableメンバを追加して、)クラス単体の性能が
上がることで、誰も不利益を被らない。(なぜならそういったメンバは
privateなことが殆どだからカプセル化を破ったわけではない。)
って事じゃないの。日本語大丈夫?
>>97が
>呼び出し側が指定できるようにしろよとか、そんな腐った設計の仕事に
>関わりあいたくないとか言われてしまえば、そこでお終いになるわけだが、
>あまり考えたくない諸般の事情…
ってことわっているにも関わらず、
>#もう時間が残っておらず、大きな改修をくれている暇が無い
>なら、大きな改修をする必要性がなくなればいいわけで、
>ユニットテストは(その効能が事実であるならば)有効でしょう。
なんて事を意気揚揚と書き込んだわけね。
そういうところが某言語厨ぽい。
0109100
NGNGうーん,具体的にどうやれば安全にmutableを排除できるのかちょっと思いつかない・・・
自分のやりたいことは下なんですが・・・
class Data
{
vector<double> v;
mutable double avg_cache;
mutable bool is_avg_cached; // vが変更されればfalseに
double getAverage() const{
if(is_avg_cached){
return avg_cache;
}else{
double result;
// まともに計算;
avg_cache = result; is_avg_cached = true; return result;
}
}
0110デフォルトの名無しさん
NGNG教科書に載せたいくらいだ。
011198
NGNGclass Data
{
vector<double> v;
DataObserver* pObserver;
};
class DataObserver
{
void OnChange();
};
011298
NGNGhttp://dictionary.goo.ne.jp/search.php?MT=%CD%BD%CB%C9%BA%F6&kind=&mode=0&jn.x=50&jn.y=13
キミ、日本語もだけど頭大丈夫?
本人気づいてないのかもしれないけど、
自作自演って案外みえみえだよ。
0114デフォルトの名無しさん
NGNG011798
NGNGconst性について誤解しているのかなと思ったので
参考にだけど、下記はコンパイル通るよ。
struct InformationImpl
{
StringType GetName();
};
struct Information
{
InformationImpl* pImpl;
Information(){}
StringType GetName() const
{
pImpl->GetName();
}
};
int main()
{
const Information info;
info.GetName();
return 0;
}
011898
NGNGtypedef char* String; // ご愛嬌
struct InformationImpl
{
void SetName(String name); // unconst method
};
struct Information
{
InformationImpl* pImpl;
Information(){}
void SetName(String name) const
{
pImpl->SetName(name);
}
};
int main()
{
String name;
const Information info;
info.SetName(name);
return 0;
}
0119114
NGNG委譲している実装部(というかデータ)部分は初期値でNULLが入ってるんだよ。
そして、必要なアクセスが実際に発生したらnewする。
こんな実装にしたのは、特に起動時に待たされる時間が長かったから。
#実際には、優先度を下げたworkerスレッドでの読み込みを併用したけどね。
別にこのやり方が正しいとも、エレガントだとも思わない。
ただ、俺が実際に使ったというだけのこと。
0120114
NGNGclass A {
class A_impl;
mutable A_impl *p;
public:
A(): p(NULL) {}
void access() const;
};
void A::A_impl::access()
{
...
}
void A::access() const
{
if (!p)
p = new A_impl();
p->access();
}
0122デフォルトの名無しさん
NGNG0124デフォルトの名無しさん
NGNG普通、proxyってのは目的のクラスがあって、直接アクセスする代わりに
それに対してのラッパー的なものを用意する、主と従が逆の意味な気がするけど。
形だけでパターンを分類している人にはどうでもいいけどね。
012695
NGNG#define volatile mutex
mutex mutable int a;
なんて書き方想像すると嫌な感じ・・
0127126
NGNG#define mutex volatile
ね。
0128デフォルトの名無しさん
NGNG>>111以降のコードって、あんまり価値がない。
>>109の例では
「平均値の取得によって、オブジェクトの状態が変化しない」
ということが表現されていましたが、
>>118では、
「名前の設定により、オブジェクトの状態が変化しない」
という、"意味的に"不適切な表現がされているとおもいます。
まあ、"意味的な"オブジェクトの状態の変化と
実際のオブジェクトの状態の変化を切り離す事が出来る
と言う例のつもりなのでしょうけど。
>>124
> 主と従が逆の意味な気がするけど。
ぜんぜん逆には思えませんが。
起動時に目的のクラスにアクセスすると待たされる時間が長かったからwrapしたんでしょ?
012998
NGNGなんでconstメソッド内でメンバに代入する必要があるのか?
もうここまでくると何故mutableキーワードを使う必要があるのかと
同義になっちゃってるんですが、何故使う必要があるのか、
それを聞いてるんですが。
>>124
GoF本のproxyの適用可能性の項を読め。
聞きかじりの知識だけでパターンを脳内分類している人は知らなかっただろうけどね。
>>125 = >>123 = >>95
キミはmutable以前にconstを理解できてるかな?
あわれな自演君、キミね、知識不足だから自作自演ばれてるって言ってるのも
理解できないのかな?
キミが説明しているのは mutable キーワードの機能なのね、
滅多に使う必要のない mutable キーワードを使うべきまっとうな理由を聞いてるんだよ。
0131デフォルトの名無しさん
NGNGhttp://pc2.2ch.net/tech/kako/1056/10567/1056716338.html
013298
NGNG>「名前の設定により、オブジェクトの状態が変化しない」
>という、"意味的に"不適切な表現がされているとおもいます。
誤解されているようですが、>>118は
constのオブジェクトが非constのオブジェクトへのポインタを持つ例です。
constのポインタとconstオブジェクトへのポインタを混同してないか?を
確認する為に掲示したもので、>>109に対応するコードとして掲示したのは>>111のみです。
013395
NGNG何で自作自演になるの?
自分のスタンスは>>113で言った通りだが。
>もうここまでくると何故mutableキーワードを使う必要があるのかと
>同義になっちゃってるんですが、何故使う必要があるのか、
>それを聞いてるんですが。
は、俺が聞きたいくらいだ。
もともと95で投げた発言は
>逆に、どういう時に使うの?
だぞ?
分かってるとは思うが・・・くらいは>>123で書いておけばよかったか?
013498
NGNGキミ、悪いけどキショイよ。
虐めた人がいたスレッドは全部取ってあるの?
それで嫌な事があるたびに「同じニオイがする」とか書いてるのかな?
本当に、病院、行った方がいいよ。
0136デフォルトの名無しさん
NGNG底が知れちゃったからもういい、勝手にどうぞって感じ
0137デフォルトの名無しさん
NGNG啓蒙してますが、そういうものなんですか そうですか。
0138デフォルトの名無しさん
NGNGC++ の開発者(名前忘れた)が言っていたけれど、 private にすべきでないメンバまで private にしてしまい
再利用が難しくなる問題があるが、これを上手く解決する良い方法が現状ないといってました。
const も同様の問題を抱えているとは思う。
0139デフォルトの名無しさん
NGNGクラス提供側の想定してないレベルに再利用性を求めるなら、
自己責任でconst_castしろやの一言って気がするんだが、
気に食わない人、いっぱいいるんだろうなあ。
0140デフォルトの名無しさん
NGNGこの人病院行ったほうがいいよマジで。
0141デフォルトの名無しさん
NGNG0142デフォルトの名無しさん
NGNGまとめて病院逝った方がいいのかもしれんが(w
…その病院で出される飯の内容に興味があるなあ。
あと、隣の病室から「こんな飯食えるかー!!」
ガシャーンバリーンとか聞こえてきそう(w
もちろん漏れは良い子ちゃんだから、出されたご飯は何でも残さず食べまつよ?
カレー味のうんこでも、うんこ味のカレーでも。
0143デフォルトの名無しさん
NGNG0144デフォルトの名無しさん
NGNGconst_cast<排泄物 *>(うんこ)
なことしてるんだろうか?
0145デフォルトの名無しさん
NGNG関数オブジェクトとかを使い始めると、結構厄介ですよ
const を取り除いた型の抽出は、boost とか使えばまぁ簡単にできますけど
ちょっと強烈だと思う。
ちなみに個人的には const 肯定派です。
ただ上手に使うのは結構難しいとは思う。
0146デフォルトの名無しさん
NGNGあんまり見たことないけど、
やっぱり>>118みたいなソースを書く人もいるし。
0147デフォルトの名無しさん
NGNGたとえば
const int s = v.getSize();
for( int i = 0; i < s; i++ )
v.get(i).clear();
みたいに。
0148ミナツキ サヤ ◆SAYAC2HJWE
NGNG0149デフォルトの名無しさん
NGNG変えちゃいけないなら当然しちゃいますよ。
0150デフォルトの名無しさん
NGNGクラス内定数として,
static const int INT_ZERO = 0;
な感じで初期化できればいいのになぁ。
結局面倒だからdefineで切ってしまう。
Javaだとできるんだっけ?
0151デフォルトの名無しさん
NGNG後,コンパイラがその記法に未対応でコケる場合は
enumハックと呼ばれるものが常套手段になってますよ.
0152デフォルトの名無しさん
NGNG確かにできるけど、バイトコードがえげつない増え方したりして微妙に恐怖をそそる。
C++なら、int で済む限りは、そこはenumだろうね。
#define 使っちゃったら、スコープがヘッダ単位になってしまう。
本来列挙子であるところの enum で定数定義するのは無作法呼ばわりされかねないけど、
スコープはクラス内で決着するし、クラス内定数としての使い勝手は悪くないよ。
C++の建前としては、intサイズであるのも保証されてるそうだし。
守ってくれない(最適化等で勝手にcharサイズにしちゃったりとかする)コンパイラも多くって、
本当に仕様なんだろうかと思うことも多いけど。
0153デフォルトの名無しさん
NGNGああ、ほんとだ、試してみたらVC7.1だと出来るのね。
知らなかった。
仕事上、特殊なSDKを使ってるので、未だにVC6がメインなので。
うーん、enumハックはtemplateでもよく使う
手法なんで知ってますが、組んでるプログラムの
関係上、どちらかというとfloat定数が欲しい場合が
多いので。
>>152
スコープ外れると知りつつも、スコープあまり関係ない定数の場合は
打鍵数の少ない方を取ってしまうダメ人間。
もちろんほんとにスコープで分けたい場合はメンバにしてますけど。
0154デフォルトの名無しさん
NGNG確かに環境によっては使えないわ。
floatの定数欲しいときには困るんだよな…。
0155デフォルトの名無しさん
NGNG0156デフォルトの名無しさん
NGNGVC6以外のコンパイラは昔からほとんどできた
ただVC6の勢力が大きかっただけで。
まるでリトルエンディアンのアーキテクチャと
ビッグエンディアンのアーキテクチャみたい。
0157デフォルトの名無しさん
NGNGint func(const int arg1, double *const arg2) {...
みたいな感じで。
0158デフォルトの名無しさん
NGNGつけまくり。
ソースとデステネーション区別する意味でも、参照しかしない引数は
基本型以外ぜーんぶconstつけ。
…みんなそうだよね?
0159デフォルトの名無しさん
NGNGconst int は意味がないので使わないが
const int& は使う。
0160157
NGNGconst int &を使うのは常識として、const intを使うかどうか聞きたかったんだが…
つまり、>>147の例でconstをつけるなら、
関数引数にも(誤って代入しないように)constをつけるのもいいかな、と思うんだけど。
0161デフォルトの名無しさん
NGNG関数引数に代入云々は、呼び出し側には全く関係ないからなあ。
呼び出し側から見てどうでもいいものをプロトタイプに反映させるのは
個人的にはあまり好きくない。
0162デフォルトの名無しさん
NGNG必ずしもプロトタイプに反映させなきゃならんわけでもないぞ。
>>157の例なら、
int func(int arg1, double *arg2);
と宣言しておいて、定義側では>>157のようにすれば良い。
inlineやtemplateなんかには使えんがな。
0163デフォルトの名無しさん
NGNG0164デフォルトの名無しさん
NGNGていうか、それって普通にコンパイラに怒られないのか?
0165デフォルトの名無しさん
NGNGそれは無問題。
試してみろよ。
0166デフォルトの名無しさん
NGNGどっちにしろ、俺も気持ち悪くて使う気にはならんが。
0167デフォルトの名無しさん
NGNG通ればいいってもんじゃ無い気が…
ていうか、本当に通るの?
マジで??
なんか今まで信じてたものが崩壊してく感じなんですが。
0168デフォルトの名無しさん
NGNGhttp://www.caravan.net/ec2plus_j/language_spec.html
0169デフォルトの名無しさん
NGNG0170デフォルトの名無しさん
NGNG規格の話するならできれば引用して欲しい。
>8.3.5 Functions 3
>(略)
> Any cv-qualifier modifying a parameter type is deleted.
> [Example: the type void(*)(const int) becomes void(*)(int) - end example]
> Such cv-qualifiers affect only the definition of the parameter within the body of the function;
> they do not affect the function type.
というわけで完全に合法だな。
でも個人的には宣言と定義で見た目が変わるのは気持ち悪いし、引数が const int なのも
気持ち悪いと思う。
0171デフォルトの名無しさん
NGNG引数の上の const の有無では、関数のオーバーロードは成立しねえんだ。
関数プロトタイプの引数上 const の有無からじゃ、呼び出し側がどの関数呼べばいいのか
コンパイラは判別つけられないから、こりゃ当然の仕様なのか。
かといって、プロトタイプと実関数の定義が分かれてしまってて許されるなんて…。
気持ち悪いよ〜!!
0172デフォルトの名無しさん
NGNG> 参照しかしない引数は
> 基本型以外ぜーんぶconstつけ。
ポインタで渡したり参照で渡したり以外という意味でつか?
0173デフォルトの名無しさん
NGNGmutable指定子
例外処理
実行時型識別
ネームスペース
テンプレート
多重継承と仮想継承
mutable以外は外しちゃならない機能ばかり。
組み込みC++って大変ね。
0174デフォルトの名無しさん
NGNGRTTIはまあいいとして…
namespaceもなんとか大目に見られるとして…
テンプレートはコンパイラ側の問題だろうに…
上でも誰かが言ってたが、インラインアセンブラとの相性いいんだぞ…
多重継承はまあいらんとしても、仮想継承禁止ってなんだそりゃ…
C++なのか、それ。
C99と何が違うんだ。
0175デフォルトの名無しさん
NGNG0176デフォルトの名無しさん
NGNGC++使いも最近は実装の多重継承しないのが本流になっているので、
>>174がインターフェイスクラスの継承も機能的には多重継承だと気づかなかったに
8086ガバス
0178デフォルトの名無しさん
NGNGま、標準ライブラリも無いに等しいくらい少ないのだが。
なまけものコンパイラ屋が考えたのだと思ってる。
0179デフォルトの名無しさん
NGNGstdネームスペースが無い…マジスカ?
標準ライブラリも無いに等しい…マジスカ?
規格として存在する意義がよくわからん…。
とりあえず最底辺だけ決めたってことなんだろうか。
0180デフォルトの名無しさん
NGNG>規格として存在する意義がよくわからん…。
禿道。
規格を作ってポータビリティを向上できるようなシステムはリソースもあるので普通のC++でいいと思うし、
リソース的に色々制約があるシステムの場合はターゲットごとに癖が強いから規格にする意味がないし。
0181デフォルトの名無しさん
NGNGvoid fund(const Object &obj) const;
のconst ね
行って帰ってきたら、中身がかわってるかどうか、
わかんないなんて...
0182デフォルトの名無しさん
NGNGそのインスタンスを渡すようにしてはいかがだろう。
&って?
0183デフォルトの名無しさん
NGNG取っ払ってるのが最近の流行なんだろうけど…。
そのために一々細かくクラス用意するのはバカらしく思えることだってあるし、
J2MEとかだと、そもそもそんなことのためにクラス用意してる余裕は無かったりするんだよな。
基本型の配列渡すのにも、一々どっちがsourceでどっちがdestinationか確認しながらやるのはビクビクもんだ。
コンパイラにちょっと叱ってもらうだけでも、ヒューマンエラーは随分減るのに…。
0184遅レス
NGNGfoo()はメンバ変数を変更しないという意味だろ?
0185デフォルトの名無しさん
NGNGclone なり new なりが発生するってことだろ。
clone と new が早けりゃ文句ないんだよ。
java は clone と new が遅いだろ。
0186デフォルトの名無しさん
NGNG0187デフォルトの名無しさん
NGNG0188デフォルトの名無しさん
NGNGpublic void change(Object argObject) { /* ... */ }
public void unchange(ConstObject argConstObject) { /* ... */ }
さらに、引数への代入をコンパイルエラーとして報告してもらいたければ、
public void unchange(final ConstObject argConstObject) { /* ... */ }
を使う。
0189デフォルトの名無しさん
NGNG道理だが…
まったく使う気しねえなあ…
0190デフォルトの名無しさん
NGNG0191デフォルトの名無しさん
NGNGclass ConstBase {}
class MutableBase extends ConstBase {}
class ConstSub extends ConstBase {}
class MutableSub extends *** {}
*** はどうするのよ?
0192デフォルトの名無しさん
NGNG多重継承の呪縛に囚われた人間がここにも……!?
その腐った設計を見直せ
0193デフォルトの名無しさん
NGNG0194デフォルトの名無しさん
NGNGはずかしい
0195デフォルトの名無しさん
NGNGえっち。
0196デフォルトの名無しさん
NGNGJava厨ウザイ
0197デフォルトの名無しさん
NGNGちんこ洗ったか?
0198s
NGNG勉強中.
0199デフォルトの名無しさん
NGNGint main(const int argc, const char* const* const argv)
0200デフォルトの名無しさん
NGNG0201デフォルトの名無しさん
NGNG0202デフォルトの名無しさん
NGNG有体に言うとウザい。
0203デフォルトの名無しさん
NGNGコーヒーこぼしちまったじゃねーかw!!
0204デフォルトの名無しさん
NGNGだな
0205デフォルトの名無しさん
NGNGint main(int argc, char **argv) {
{
const int argc = argc;
const char*const*const argv = argv;
return 0;
}
}
0206デフォルトの名無しさん
NGNG0207デフォルトの名無しさん
NGNG0208デフォルトの名無しさん
NGNG0209デフォルトの名無しさん
NGNG↑このconstってCで合法だっけ?
0210デフォルトの名無しさん
NGNGすなわち危険な匂いを漂わせる船の男にして、港の女はメロメロ。
0211デフォルトの名無しさん
NGNGメンバ関数以外にも使える処理系があるのか?
0212デフォルトの名無しさん
NGNG0213デフォルトの名無しさん
NGNG#define const
0214デフォルトの名無しさん
NGNG#ifdef const
#error 通報されますた!
#endif
を主要ヘッダに仕掛けてましたよ!
奴は一人でもやる気です!
0215デフォルトの名無しさん
NGNG#include <hoge>//など
#define const
マジレスするとヘッダのインクルードより後にやればいいだけでは?
0216デフォルトの名無しさん
NGNG自分の家族を守れば十分なんだろう?
0217デフォルトの名無しさん
NGNGhttp://pc5.2ch.net/test/read.cgi/tech/1082047479/972-
0218デフォルトの名無しさん
NGNG願わくば、後ろにconst置くスタイルが一般的になって欲しい。
0219デフォルトの名無しさん
NGNG0220デフォルトの名無しさん
NGNG亀レスだがfunc 後のfuncはクラスのメンバ関数にのみ許される。
一般の関数については許されてないし、必要ない。
0221デフォルトの名無しさん
NGNGfunc の後のconst 丸
0222v(^・^)v
NGNGhttp://pc5.2ch.net/test/read.cgi/tech/1084030770/
0223デフォルトの名無しさん
NGNG0224デフォルトの名無しさん
NGNG0225デフォルトの名無しさん
NGNGreadonlyの方がわかりやすかった気も
0226デフォルトの名無しさん
NGNGconstが、ある変数を誤って変更しないようにする目的であるのなら、
constとして扱いたい変数の名称を、コンストっぽいやつ、
例えば、GravitationConstantとか、a_constとかにすれば良いの
ではないでしょうか。
0227デフォルトの名無しさん
NGNG∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ^∀^)< あほか
( つ ⊂ ) \_________
.) ) )
(__)_)
0228デフォルトの名無しさん
NGNGそこでconst_castですよ
0229デフォルトの名無しさん
NGNG0230デフォルトの名無しさん
NGNGprivateが、あるメンバ変数を隠蔽する目的であるのなら、
privateとして扱いたいメンバ変数の名称を、privateっぽいやつ、
例えば、private_dataとか、a_privateとかにすれば良いの
ではないでしょうか。
0231デフォルトの名無しさん
NGNG0232デフォルトの名無しさん
NGNG「おい。おまえの作ったクラス、うまく動かないぞ。このprivate_aって変数に0を代入したらおかしくなったぞ。」
と言われないためです。
0233デフォルトの名無しさん
NGNG0234デフォルトの名無しさん
NGNGbcc
エラー E2153 233.cpp 1: #define 疑似命令には識別子が必要
g++
233.cpp:1:9: macro names must be identifiers
vc
233.cpp(1) : error C3209: '?III' : Unicode 識別子は現在サポートされていません。
mwcc
# File: 233.cpp
# -------------------
# 1: #define I I I
# Error: ^
# identifier expected
0235デフォルトの名無しさん
NGNGこれLPCSTRにするとうまくいかなかったがconst LPSTRだとうまくいった。
typedef CHAR *LPSTR, *PSTR;
typedef const CHAR *LPCSTR, *PCSTR;
だと言うのに。
ところでwindows.hの中の中ではchar*やwchar*から大きく分けて、
〜CHAR/〜CH/〜STRの3種類にtypedefしてるけど、
〜CH系って使っているの見たことない。
0236デフォルトの名無しさん
NGNG0237235
NGNGなぬっ!
そういうことだったのか。
winbase.hの中のWinMainの宣言をLPCSTRに書き換えれば、
もちろんうまくいくんだけどそこまでするメリットってないよね。
0238デフォルトの名無しさん
NGNG「うまくいく」「うまくいかない」が何なのかさっぱりわからない。
0239デフォルトの名無しさん
NGNG何で無理やり const つけるのよ。
もともとついてないんだから変更しても構わないってことでしょ。
自分で変更しないってことを強制したいなら LPCSTR を受ける MyWinMain でも作って
WinMain から呼び出せばどーよ?
0240デフォルトの名無しさん
NGNG0241デフォルトの名無しさん
NGNGあれですよ。
ドミノあほほど並べる人が途中に挟むストッパーみたいなもん。
0242デフォルトの名無しさん
NGNGうぬぅ!解り易い説明だぁ!
0243デフォルトの名無しさん
NGNGなるほど、どじな同僚に倒されないように、ですな。
0244デフォルトの名無しさん
NGNG自分で蹴っ倒す事もあるでよ。
まあそのなんだ。
倒さないことが大事なんであって、誰が倒すかは、この際問題じゃないですよ。
0245デフォルトの名無しさん
NGNGうまい!確かにそんな感じ。
0246デフォルトの名無しさん
NGNGローカル変数にconstがまったくないとすげえ不安になる
そういうときは、初めて代入するところに宣言をもってって
constにするといろいろ分かってくる。
0247デフォルトの名無しさん
NGNGコンパイラに「洗い出し」をやらせるんだよな。
漏れも泥臭い仕事の時にはよくやる(w
0248デフォルトの名無しさん
NGNGYes. コンパイラは検出ツールでもあると考えているよ。
正直そういうアドバイス機能もあってもいいと思うんだよな。
どうせコンパイラは変数の有効期間を検出してるんだし。
で、
たまに見かけるのが、ループ変数のような一時変数を、関数の先頭で
宣言し、使いまわしている奴。Cのスタイルを引きずってるのかなあ。
明らかにconstractに時間のかかりそうなものなら分からんでもないが、
forループのiが置いてあると書いた奴の能力を疑う。
constからズレたけどオカズっつうことで
0249デフォルトの名無しさん
NGNG使いまわしの極意は、整数変数にポインタを代入することです。
Cのスタイルを引き摺っているんだろうけど、許せん。
0250デフォルトの名無しさん
NGNG古くからのプログラマで組み込み畑の人だと、void * の代わりに unsigned int を使ったりするから油断できない。
0251デフォルトの名無しさん
NGNG>ループ変数のような一時変数を、関数の先頭で
VC++あたりはデフォルトでそれを許してくれないのが…。
0252デフォルトの名無しさん
NGNGfor (int i = ...)
...;
for (int i = ...)
...;
って書き方ができないことを言ってる? だったらVC.NETにすれば大丈夫。
そうでなくても、大抵の場合は二度目(以降)のintを省略するだけでも違うと思う。
0254デフォルトの名無しさん
NGNGレジスタを使い倒せるように、変数を使い回すのも多少は意味があったけど
今は読みづらくするだけだね。
0255デフォルトの名無しさん
NGNG246氏付近はどういうことをいっているのでしょうか?
(c++歴があまり長くないので理解できないんだと思います。
0256デフォルトの名無しさん
NGNG0257デフォルトの名無しさん
NGNG何がどう判らないか判らないのだが。
一応>246の話を解説しておくと、怪しげなローカル変数にconstつけてコンパイルすると
エラーがでるから様子がわかるって話だ。
0258デフォルトの名無しさん
NGNG>レジスタを使い倒せるように、変数を使い回すのも多少は意味があったけど
使い回すよか、中括弧でズタズタにコードを刻んで
変数の寿命を明示的に指定するようにしてた希ガス。
コンパイラ説得スタイルだっけ…最近は楽になったよなあ。
0259デフォルトの名無しさん
NGNG(アホな)コンパイラ説得ですな。
0260デフォルトの名無しさん
NGNGSomeObject obj;
{
int x = hogehoge();
int y = x * foo() + bar();
int z = baz(y);
obj = new SomeObject(x,y,z);
}
中カッコの内部の制御構造がもし複雑になっても,Javaならローカル変数の未代入を
エラーとして報告してくれるので嬉しい.
C++でも出来た気もするけど…
しかしC++ではインスタンスの生成が new 以外でも出来るのでややこしい.
C++で,
SomeObject obj(x,y,z);
などとやりたい場合は,上のJavaの例のようにx,y,zのスコープを
切り分けることができない.悔しい.
0261デフォルトの名無しさん
NGNG0262デフォルトの名無しさん
NGNGSomeObject* obj;
{
int x = hogehoge();
int y = x * foo() + bar();
int z = baz(y);
obj = new SomeObject(x,y,z);
}
0263デフォルトの名無しさん
NGNGローカル変数の未代入に警告出すのは言語の機能じゃなくってコンパイラの機能だし、
出せないコンパイラはまず存在しないだろし。
初期化子とインスタンスの寿命を切り分けられないのは…
まあ確かにそうだし、何らかの理由で分けたければ>>262の形になるんだろうが…
あー、あれか。
初期化子になんか使い回しの変数類が紛れ込んじまったりとか、
そういうことを危惧してるのか。
確かにC++は関数の引数の評価順番が不定だから、明示的にこの種の初期化を
やってやる必要が出てくる場合もあるわな。
…正直、それが気になるケースってほとんど出くわしたことないや。
藻前らどーよ。
0264デフォルトの名無しさん
NGNG>初期化子になんか使い回しの変数類が紛れ込んじまったりとか、
>そういうことを危惧してるのか。
俺の場合は、
int x = hogehoge();
int y = x * foo() + bar();
int z = baz(y);
SomeObject obj(x,y,z);
// ここでまだx,y,zがスコープアウトしていない、ってのが気になる。
// まあ、気になるって言うだけの事だが。
0265デフォルトの名無しさん
NGNG>>262じゃ不満なの?
0266260
NGNG>// ここでまだx,y,zがスコープアウトしていない、ってのが気になる。
>// まあ、気になるって言うだけの事だが。
(確かに変数の未代入はコンパイラの問題です罠.)
引数の評価順ってのは意図してませんでした…
>>262 は, 自分的に auto_ptrを使ってないのが不満.
あとこのコード片を含む関数が SomeObj* ではなく SomeObj そのものを
返す仕様になっている場合使えない.
0267デフォルトの名無しさん
NGNG> >>262 は, 自分的に auto_ptrを使ってないのが不満.
そんな枝葉を(w
auto_ptr使えばいいじゃん。この話とは関係ないんだから。
> あとこのコード片を含む関数が SomeObj* ではなく SomeObj そのものを
> 返す仕様になっている場合使えない.
RVOを気にしなくていいなら、スタック上に生成してコピーを返せば問題ないと思うけど。
代入演算子も必要になるけど。
0268デフォルトの名無しさん
NGNGあんまり神経質にならない方がいいんだろうけどね…。
参照カウンタとかが入ってると、多少のオーバーヘッドになる可能性は否定できないが。
スレ違いsage
0269デフォルトの名無しさん
NGNGそろそろconstの使い方まとめてくれ。パーフェクトなやつを。
0270デフォルトの名無しさん
NGNG0271デフォルトの名無しさん
NGNG妙に下世話で現実的な本になるか、
下町の人情溢れるハートウォーミングな一冊になるか、
頭から尻尾までみっちりぬるぽの詰まったガガガ本になるか
0272デフォルトの名無しさん
NGNG0273デフォルトの名無しさん
NGNG0274デフォルトの名無しさん
NGNG近寄りすぎている…というのが新しい世代の言語の言い分だし、それはわかるんだけど、
constでロジック間を信頼関係で結んでいく、あのかっちり感は萌えるんだよなあ…。
const使ってるお陰で最適化がめちゃめちゃ強力に効いた時とか、妙に嬉しいし。
0275デフォルトの名無しさん
NGNGC++ばっかやってる漏れにはさっぱりわからん。
0276デフォルトの名無しさん
NGNG> const使ってるお陰で最適化がめちゃめちゃ強力に効いた時とか、妙に嬉しいし。
C++でもそんなことありうる?
内部で const_cast やってる可能性もあるし、下手な最適化できないように思うんだけど。
0277デフォルトの名無しさん
NGNGポインタや参照で渡されたオブジェクトはconstであっても
最適化をかけんだろうな。エイリアスの可能性があるし。
作成時からconstになってて、そのポインタを取ってなければ
最適化の余地があるね。
constメンバ関数は最適化の可能性が一番高いような気がする。
つかconstの最大の効能はプログラマを縛ることだと思うよ・・・
0278デフォルトの名無しさん
NGNG0279デフォルトの名無しさん
NGNGJavaなんかだと設計上状態が変化しない(immutableな)クラスを作成させる。
C++はconstを使うことで一時的に状態が変化しないようにできる。
「状態が変化しない」ことをどの概念で扱うかの違いだよな。
文法が簡単になった分、設計に跳ね返っているのかな?
0280デフォルトの名無しさん
NGNG0281デフォルトの名無しさん
NGNGrestrictって、const/volatileと同列の修辞子?
そうだとしたら、オーバーロードの複雑さが倍になって悶死しそうじゃないか?
0282デフォルトの名無しさん
NGNGC++ の "const T" ⊆ "T" という直感的な性質がほぼ自動的に得られる
っていうのは便利だけど、Java の、こういった「暗黙知」の様なものを
排除しようという方向性もアリだよね。
設計に跳ね返るといえば跳ね返るわけだけれども、言語上の機能や直感的な
性質を論ぜずに単純にクラスとして分析・定義できる分ラクとも言えるわけだし。
例えば mutable なクラスは(面倒なので)作らないで、簡易な機能だけ実装した
builder の提供でお茶を濁そう、とか。
0283279
NGNGレスありがとう。設計という観点から見て、君の言うように言語に
依存しない汎化もあるな。それにマルチスレッドを意識したりすると
immutableが重要な要素になるのでクラスになっているほうが
わかりやすい気もする。
と、言うより設計側から実装を縛るにはクラスとしてmutableかどうかの
性質付けをするしかないんだよな。
constは実装に近い概念なのだと再認識した。
constが無い環境をやってると、mutableクラスがどんどん減るような
気がする。実装でミスする可能性が高いから設計でカバーしようと
するのだろうか。
0284デフォルトの名無しさん
NGNG> C++はconstを使うことで一時的に状態が変化しないようにできる。
なんか激しく勘違いしてない ?
volatile const int x; とか書けるのを知らないのか ?
>>277 の最終行が正解だと思うが...。
0285デフォルトの名無しさん
NGNG0286デフォルトの名無しさん
NGNG何回トイレに逝けるかな?みたいな?
0287デフォルトの名無しさん
NGNG参照やポインタのパラメータに関しては、変更のあるや無しやがパラメータの型を
見るだけですぐわかるというメリットもある(けど immutable 型でも同じか)。
0288デフォルトの名無しさん
NGNG0289デフォルトの名無しさん
NGNG0290デフォルトの名無しさん
NGNG0291デフォルトの名無しさん
NGNG0292デフォルトの名無しさん
NGNGなぜなんだろ。漏れも使ってないし・・・
double const power(double x, double y) みたいなやつ。
0293デフォルトの名無しさん
NGNGもしやクラスに属してない時は、それが純関数の宣言になるの?
って言うか、純関数ってなんだろう。
0294デフォルトの名無しさん
NGNGそれならconstは何の関係もないと思うが…
0295デフォルトの名無しさん
NGNG0296デフォルトの名無しさん
NGNGgcc でいう __attribute((const)) が >>292 的シンタックスで、というのを
何かで読んだような気がするんだけど、夢だよね。
0297デフォルトの名無しさん
NGNG0298デフォルトの名無しさん
NGNG・副作用が無い
・引数が同じなら、戻り値も同じ
という意味です。
0299デフォルトの名無しさん
NGNG2) constは諸刃の剣
3) constは神
あなたはどっち?
0300デフォルトの名無しさん
NGNG3
3択で「どっち?」とは、答えにくいな。
0301デフォルトの名無しさん
NGNG4) constには大きなメリットがあるが、C++のconstの仕様(特にクラス)は腐っている
0302デフォルトの名無しさん
NGNG0303デフォルトの名無しさん
NGNG0304デフォルトの名無しさん
NGNGconstの大きなメリットを腐らせないためにC++の仕様を改良するとしたら、どうしますか?
面白そうなので、なるべく具体的なのきぼん。
0305デフォルトの名無しさん
NGNG0306デフォルトの名無しさん
NGNGオブジェクトに対するconstは撤廃だろ。
そんなもんのメリットもない。
ついでにオブジェクトの値渡しも撤廃。
ついでにコピーコンストラクタも撤廃。
ついでに参照にNULL突っ込めるように変更。
ついでにオブジェクトの値型変数を撤廃して参照のみにする。
いじょ
0307デフォルトの名無しさん
NGNG要するにポインタ変数しか存在させない、常にnew/deleteしるってことか。
0308デフォルトの名無しさん
NGNG他のOOPLで開発しててそう感じる。
0309デフォルトの名無しさん
NGNG0310デフォルトの名無しさん
NGNGいちいちR/Wなクラスに対応するR/Oクラスを探すのがめんどい。
いちいちクラス設計者の趣味に合わせたでたらめな対応なんか覚えたくない。
0311308
NGNGそりゃobject.freeze()一発で自動的にしてくれるんならいいけど
C++の仕様はあまりにも変質的だよ。コストに見合ってない。
0312デフォルトの名無しさん
NGNG0313デフォルトの名無しさん
NGNG0314デフォルトの名無しさん
NGNGぜんぜんそのようにおもったことがない
0315デフォルトの名無しさん
NGNGconstな変数、オブジェクト等を色付きや波線が付いた文字で表示するようにして、"const"という文字を書かないようにする。
ただし、ヴィジュアル環境だけに限定
0316デフォルトの名無しさん
NGNG>オブジェクトに対するconstは撤廃だろ。
>そんなもんのメリットもない。
あると思うけどなあ…。
finalize()があるなら我慢してもいいけど、ランタイムでの状態の控えが
インスタンスに乗っかる様では、C++の旨味の一つが減る事になるし。
>ついでにオブジェクトの値渡しも撤廃。
まあ、これはそれなりに同意。コンパイラの頑張りで最適化かかることもあるとはいえ、
そもそもその頑張り方でコンストラクタの呼び出し回数が変わる可能性があるのは
恐ろしすぎる。
とはいえ、関数からの返り値オブジェクトのためだけにガベコレ搭載とヒープメモリの使用が義務づけられる様では、これも堪らない。
スタック上に返りオブジェクトを積む事を明示的に指定できるよう言語仕様を拡張してもらえばいいのだろうか。
…余計な文法増えるくらいなら、コンパイラの最適化能力を義務づけてもらう方がマシといえばマシかもしらん。
考えたらリンク時最適化まで必要だな、これ。関数の呼び出しプロトコルに関わる話だ…。
>ついでにコピーコンストラクタも撤廃。
これは善し悪し。でも、宣言したときしか使えないくらいにして欲しいのは確かかな。
>ついでに参照にNULL突っ込めるように変更。
えー…。
まあそのなんだ。Javaの文法にテンプレートが乗るなら、確かにconst無くてもいいわ。
とはいえ、単にポインタからアロー演算子取っ払っただけの実装で
ポインタと(スタックとかに積まれてるかもしれない)オブジェクトの
インスタンスとの区別が言語の上でつけられなくなるのは、漏れ的には困る。
その辺の泥臭いところを使用者が好きに使う事で、性能とのトレードを計れるのが
C++最大にして唯一の強みなんだし、それが無くなるならそんなんいらんわ。
0317304
NGNG> オブジェクトに対するconstは撤廃だろ。
> そんなもんのメリットもない。
ROM環境を考慮すれば、メリットの有無とかそんな問題じゃなくて、単純に「必要」です。
撤廃はありえないと思います。
それぞれの変更案について、それによって現状のどんな問題が解決できるのか、教えてもらえますか?
0320デフォルトの名無しさん
NGNGconst逝ってよし!
0321デフォルトの名無しさん
NGNGビット的constと概念的constの二つの意味を持ち得るのが、最大の問題点。
個人的には、
オブジェクトのconstは、ポインタを保持している場合、
コンストオブジェクトへのポインタに変換できるようにして、
ビット的tかつ概念的constにできれば。
内部状態が変更され得る概念的constは、面倒でもReadOnlyインターフェイスを作る方向で。
0322デフォルトの名無しさん
NGNGconstだのReadOnlyにしようというのはおかしな話だ。
その変数のスコープを限定するのが筋。
オブジェクトも同様。
0323デフォルトの名無しさん
NGNG>内部状態が変更され得る概念的constは、面倒でもReadOnlyインターフェイスを作る方向で。
そのためのmutableだろ?
0324321
NGNGいや>304のC++の仕様を改良〜に対しての俺案として、
constを完全なビット不変の記号として使えるようにして、mutableも廃止。
今現在の概念的constとしてはconstを使えないようにする。
と、いくらか解りやすくないだろうか?
ということを言いたかったんです。
0325デフォルトの名無しさん
NGNG0326デフォルトの名無しさん
NGNG定数展開が約束される、定数でしか初期化されない修飾子constと、
単に変更不可の修飾子readonlyに分けて欲しくありませんか?
0327デフォルトの名無しさん
NGNGグローバル変数、関数内static、文字列リテラルのみを指せる修飾子
0328323
NGNG俺が言いたかったのは、mutableの存在からしても、現状のconstは概念的な不変性を表す物であって、
「二つの意味を持ち得る」などと言う事は無いのではないか、と言うこと。
俺の考えでは、組み込み型ではたまたまこの二つの不変性が一致しているだけで、
ユーザー定義型でビット単位の不変性を保証する仕組みは現在のC++には無く、
今後も必要無いように思う。
0329デフォルトの名無しさん
NGNGこのことはほとんど議論挟む余地が無いと思う。
良くも悪くも、C++はそういう言語だ。
0330デフォルトの名無しさん
NGNG0331デフォルトの名無しさん
NGNGthrowsを骨抜きにしているのがどうにも解せないな。
0332デフォルトの名無しさん
NGNGどうも歴史的な事情らしいんだけど、詳しくないのでよくわからん。
0333デフォルトの名無しさん
NGNG#pragma warning(disable:4114)
int main(
const const const const const const const const const const const const const const const const const const const const const
const const const const const const const const const const const const const const const const const const const const const
const const const const const const const const const const const const const const const const const const const const const
const const const const const const const const const const const const const const const const const const const const const
const const const const const const const const const const const const const const const const const const const const const
const const const const const const const const const const const const const const const const const const const const const int argc,
const char* const* const argv)
0334デフォルトの名無しさん
NGNG0335デフォルトの名無しさん
NGNGそんだけ。
0336デフォルトの名無しさん
NGNG戻り値にconstが付いていない。-10
0337デフォルトの名無しさん
NGNGそんな!殺生な!
#pragma warning(disable:4114)
const const const const const const const const   const
const const const const const const const const const
const const const const const const const const
const const const const const const const
const const const const const const const const
const const const const const const const const const int main(const int argc, const char* const* const argv)
0338デフォルトの名無しさん
NGNGプログラミング言語C++の !でNULLって書いてるの思い出した。
0339デフォルトの名無しさん
NGNG「なんかこう、引き締まっていくカンジ〜♪」を楽しむのが趣味なのですが、
僕はフェチ板に書き込むべきでしょうか?
0340デフォルトの名無しさん
NGNGフェチは産まれた時から引き締めてないと。
むしろダイエット板に書き込め。
0341デフォルトの名無しさん
NGNGお蔭で、ただの雪駄にまでconstをつけてしまい、溜息を吐きながら外す日々。
0342デフォルトの名無しさん
NGNG0343デフォルトの名無しさん
NGNG「メンバ」ってメンバ変数とメンバ関数の両方のこと?
何と比べて、なぜ明確なの?
0344デフォルトの名無しさん
NGNG0345デフォルトの名無しさん
NGNGだから、何を根拠にいってんの?
0346デフォルトの名無しさん
NGNG迷う事は確かにないな。
あるのはごくたまにパフォーマンス上の理由かなんかで
外さなきゃならんかと苦悩したり
mutable使っちまえば楽になるかと苦悩したり
なんで藻前その宣言constじゃないんだよ漏れ様にconst_castさせようってかぬっころすと
殺意抱いたり、そんなレベルの悩みだよな。
0347デフォルトの名無しさん
NGNG0348デフォルトの名無しさん
NGNG言い出しっぺがいきなり背理法もないだろう。
0350デフォルトの名無しさん
NGNG論理的constと物理的constの狭間で迷うことが幾度かあったな。
遅延初期化、copy on write、proxyっぽいものを作れば現れる問題だと思う。
0351デフォルトの名無しさん
NGNGその関数が意味するところによって即座に決まるの。
0352デフォルトの名無しさん
NGNG背理背理法背理法ほっほー♪
0353デフォルトの名無しさん
NGNG背理っ背理っふれっほっほー♪
「粘着にはなるなよ?」
まーるーだーいー…
0354デフォルトの名無しさん
NGNGもまえ>>350の言ってる事わかってないだろ。
それはさておき、>>351の言うレベルで迷う事なんかないのは自明だとは思う。
頭悪い発言スレに乗せたいくらいだが、「ビルドエラーでない限り全部const」でFA。
0355デフォルトの名無しさん
NGNG0356デフォルトの名無しさん
NGNGこのスレをmutableで検索してみると
わかってる奴と、わかったようなつもりになってる奴が
再三同じ議論を繰り返してる。
わかったつもりになってる奴の方が偉そうなのも、まったく同様。
0357デフォルトの名無しさん
NGNGえーと、>>351が「わかってる奴」で、それと違う意見を述べた>>350は「わかったつもりになってる奴」
ってことかい?
0358デフォルトの名無しさん
NGNG350が実践上ぶちあたるところだな
0359デフォルトの名無しさん
NGNG逆だろ、どう見ても。
0360デフォルトの名無しさん
NGNG0361s
NGNG・デフォルトが従来のconst
・変化する変数にのみmutableを付ける
世の中にそんな言語は無いものかな?,などと愚考する.
関数型言語だと行き過ぎなんだよなあ.
スレ違いスマソ.
0362デフォルトの名無しさん
NGNG0363デフォルトの名無しさん
NGNG「コンパイルが通らないので」という理由で
すべてキャストしてる新人を説教するのに疲れました
0364デフォルトの名無しさん
NGNG遅レス。
例外中立なテンプレートを作るときに困るからじゃないの?
JavaはC++ほど例外の出番が多くないから、「このコールバックで
例外投げるべからず」とthrows Exceptionで間に合っているけど、
C++だと3歩歩けば例外が飛ぶからねえ。
0365デフォルトの名無しさん
NGNG0366デフォルトの名無しさん
NGNGJavaのメモリ不足はErrorだもんね。
0367s
NGNG>>364
Javaのほうが C++よりも 例外を使うケースが多いに一票.
もし違うというのなら, 例えばどこのベンダのどのC++のライブラリで例外を多用している?
new演算子ですら デフォルトでは例外を投げないような設定を採用している処理系もあるのに.
俺が知らないだけ?
対してJavaでは標準ライブラリにすら例外指定が頻繁に使われている. IOException然り.
#蛇足だけれどメモリ不足はOutOfMemoryErrorといって,
#Errorクラスを継承しているけれど「例外」に分類して構わない..
#(これは逆に,全然使わない印象があるけれど…?)
0368デフォルトの名無しさん
NGNG0369367
NGNGどちらにせよ, C++で例外投げたりはしないというのが 漏れの印象なのだけど.
また処理系の話になって恐縮だけど,例えばVC++の幾つかのバージョンはデフォルトで例外オフだし.
Javaのほうが例外クラスを定義して,よく投げたりするというのは,漏れだけの印象じゃないと思う.
(多分.)
また,C++をやっていたころは,「例外は本当に例外的な場合にのみ使え」と教えられていたので,
Javaの投げまくりスタイルを見て驚いた記憶がある.
#スレ違いスマソ.
0370デフォルトの名無しさん
NGNG0371デフォルトの名無しさん
NGNG例外中立性についてはJava も Generics 登場してくると似たような状況に
なるような気がする・・・ ←このへん識者が出てきて解説して欲しい
0372デフォルトの名無しさん
NGNG0373デフォルトの名無しさん
NGNGオブジェクトの解体周辺の処理が引っ掻き回されるのも大きい。
Javaはその辺考えなくて済むしね。
通信処理なんて、例外投げまくりだ。
返り値だけじゃ情報量少ないし、コードもすっきりするし、
使えるもんなら使いまくりたいけど、如何せんオーバーヘッドでかすぎ、
制御しづらすぎでどうにも。
0374デフォルトの名無しさん
NGNGスレ違い。
誘導→ttp://pc5.2ch.net/test/read.cgi/tech/1051690231/
0375デフォルトの名無しさん
NGNG> もし違うというのなら, 例えばどこのベンダのどのC++のライブラリで例外を多用している?
すべてのベンダの標準ライブラリ。以上。
>>371
JavaのGenericsはコンテナを型安全にするだけでしょ?
Javaのコンテナはアサーション的な例外しか投げないから、
別に悩むこともない。例外中立が問題になるのは、主に
Template Methodのような場合だと思う。
0376デフォルトの名無しさん
NGNG>すべてのベンダの標準ライブラリ。以上。
やっぱJavaの方が例外の使用が多いと思えるんだが
0377デフォルトの名無しさん
NGNGtypedef char *const PSTRC;
0378デフォルトの名無しさん
NGNGconstはすばらしいが、そのハンガリアンみたいな変な変数名やめろ。
0379デフォルトの名無しさん
NGNGポインタ「型」をP憑きで定義するのは、いかにもMS流だな。
0380デフォルトの名無しさん
NGNGやっぱり実装上の問題だよ。
C++はデストラクションの負荷の問題もあって、例外は基本的に
「使わないほど軽い」処理になってしまってるけど、
Javaではお手軽で安価な通信手段として完成している。
文字通り、フォローしきれないエラーは例外だから、
後よろしくって書けてしまうのはC++には無い魅力。
…別にJavaの例外が特別優秀というわけじゃなく、
単にJava自体が遅い中に処理の負担が埋もれてるだけな
気もしないでもないけど、それはきっと不勉強な漏れの勘違い。
そしてスレ違いsage
0381デフォルトの名無しさん
NGNG激しく役に立つわけだけど、こういう人間のポカミスに対して
コンパイラのエラーチェック能力を積極的に活用する自衛(?)プログラミングの
スタイルに、何か特別な名前とかあるのかな。
いや、常識の範疇にスタイルも何もないだろ、とか言われちゃえばそれまでなんだけど。
0382デフォルトの名無しさん
NGNGint定数定義以外の目的で使ったことが最近ないや
しかし、typedefせんでも、
enum Foo { ... };
Foo f;
とか書けば動くんと違うか?
あと、enumはとてもまともな列挙とはいえんから、
classでまともな列挙を実装したほうがいいような
まあそれでも、PascalやAdaの列挙には絶対勝てないが
0383デフォルトの名無しさん
NGNG問題ないですな。C++なら。
Cなら必要。
>classでまともな列挙を実装したほうがいいような
いつも思うんだが、みんなそれ本当にそう思ってるもんなのかな。
enumには、うっかり別の値が紛れ込むのをビルド時にブロックしてくれるって
それ以上の機能は期待しないでもいいんじゃなかろうか。
ちょっとしたクラスの内部状態を外に公開したり、外からの指定を受け取るのにも
enum型は手っ取り早く扱えて便利だと思うんだけど。
ちょっとしたステートマシン書くのにもクラス引っ張りまくりは
あまりに距離が遠すぎ&可読性落ちすぎつーか、
逆に言えばそのレベルで書く必要のあるものには、そもそもenumの
居場所なんかない気がする。
0384デフォルトの名無しさん
NGNGもしよかったらそのPascalやAdaの列挙にあってC++の列挙にない機能を
解説していただけないでしょうか?
0385デフォルトの名無しさん
NGNGenum | enum ⇒ int になっちゃう。
0386デフォルトの名無しさん
NGNGなるほど.
0387デフォルトの名無しさん
NGNG0388デフォルトの名無しさん
NGNGenum Enum0 {E0 = 0x1, E1 = 0x2, E2 = 0x4, E3 = 0x8};
Enum0 enum0;
enum0 = E0|E2;
PascalやAdaは知りませんが,C++だとこういう感じじゃないですか?
で,385の指摘は上記の3行目がエラーになってしまうということだと理解しました.
PascalやAdaだと1行目の割り振りも,自動で書けたりするんでしょうか?
0389デフォルトの名無しさん
NGNGenum Bit
{
HOGE = 0x01,
FOO = 0x02,
BAR = 0x04,
・
・
・
};
って具合
0390Pascalだとこう書ける
NGNGtype myenums = set of myenum;
var n: myenums;
begin
n := [e1];
n := n + [e2];
if e3 in n then ...
0391デフォルトの名無しさん
NGNGこれだと,C++ではクラスで実装ってことになるでしょうね.
>>383
> 可読性落ちすぎつーか、
可読性はマクロ使えばそんなに悪くはならないですよ.
0392デフォルトの名無しさん
NGNG[Flags] public enum MyFlag { H0 = 0, H1 = 1, H2 = 2, H3 = 4, H4 = 8 }
Console.WriteLine(MyFlag.H1 | MyFlag.H4); ⇒ H1, H4
enum は自動連番+α だと割り切れば便利。
0393デフォルトの名無しさん
NGNG今,試してたらこんなのできたんですけど,ダメですか?
#include <iostream>
using namespace std;
enum Enum0 {E0 = 0x1, E1 = 0x2, E2 = 0x4, E3 = 0x8};
int main () {
Enum0 enum0 (static_cast <Enum0> (E0|E2));
cout << (enum0 & E0 ? true : false) << endl;
cout << (enum0 & E1 ? true : false) << endl;
cout << (enum0 & E2 ? true : false) << endl;
return 0;
}
0394デフォルトの名無しさん
NGNG0395デフォルトの名無しさん
NGNGC++に単純に置き換えると、こうかな。重いな。
enum myenum {e1, e2, e3};
typedef std::set<myenum> myenums;
myenums n;
{
n.insert(e1);
n.insert(e2);
if (n.find(e3) != n.end()) { ...
0396デフォルトの名無しさん
NGNGそれは問わないことにしてたんですが(笑).
「ビットフラグの表現」以外にはPascalやAdaの列挙にあってC++の列挙にない機能ってあるんですかね?
0397デフォルトの名無しさん
NGNG0398デフォルトの名無しさん
NGNG393風にやると
enum myenum {e1 = 0x1, e2 = 0x2, e3 = 0x4};
myenum n (static_cast <myenum> (0));
{
n = static_cast <myenum> (n | e1);
n = static_cast <myenum> (n | e2);
if (n & e3) {...
return 0;
0399デフォルトの名無しさん
NGNGそういう使い方をするときは、 n の型を myenum にしちゃダメだと思う。
キャストしてまで myenum 型にしても、結局保持している値が
列挙された値になるわけでもないのだから、 myenum 型は不適。
0400398
NGNG#include <sl/debug_tool.h>
enum myenum {e1 = 0x1, e2 = 0x2, e3 = 0x4};
myenum &operator |= (myenum &p0, const myenum &p1) {
return p0 = static_cast <myenum> (p0 | p1);
}
myenum n (static_cast <myenum> (0));
{
n |= e1;
n |= e2;
if (n & e3) {...
0401デフォルトの名無しさん
NGNGあぁそっか.失礼しました.
0402デフォルトの名無しさん
NGNGこうすると軽くなるのでは?
enum myenum {e1, e2, e3};
typedef std::bitset <e3 + 1> myenums;
myenums n;
{
n.set (e1);
n.set (e2);
if (n.test (e3)) {...
0403デフォルトの名無しさん
NGNG値の受け取りも結局ただのintでしかなくなっちゃうので、
コンパイル時のエラー検出云々は一切できないし。
話がズレるけど、enumがその辺の責任まで負わされちゃってるのは
static const int CONSTANT = 0xdead;
みたいな定数式を、クラスメンバの定義に書いとくことができない
比較的古めのコンパイラのせいもあって、慣習的にそうなっちゃてるだけで、
enumをビット操作用(に限らず、任意の値の定数の定義)に使うのは、
列挙という意味では確かに正しくは無いという認識でOK?
0404デフォルトの名無しさん
NGNGその場合、bitsetのテンプレート引数の保守が問題になる。
そのソースで列挙値にe4を追加したらマズイし、
列挙の最後に個数を取るための値を置くと、
列挙型として中途半端な型になってしまう。
「enum だけで〜」スレが要るかな?
0405デフォルトの名無しさん
NGNG0406デフォルトの名無しさん
NGNG0407デフォルトの名無しさん
NGNGboolやenumをintで代用する奴は氏んだ方がよい
http://pc5.2ch.net/test/read.cgi/tech/1060556404/
0408デフォルトの名無しさん
NGNGよく510も続いてるな...
0409402
NGNGenumをビット表現に使う正当性はともかく(そんなの分かりません.),
「Pascalごときに負けられん.」ということで(笑),402を型の恩恵を受けれるようにしてみました.
using namespace std;
enum myenum {e1, e2, e3, myenum_size};
template <typename E, size_t SIZE>
class Bitset: private bitset <SIZE> {
typedef bitset <SIZE> Base_;
public:
Bitset &set (E p) {return static_cast <Bitset &> (Base_::set (p));}
bool test (E p) const {return Base_::test (p);}
};
typedef Bitset <myenum, myenum_size> myenums;
myenums n;
{
n.set (e1);
n.set (e2);
if (n.test (e3)) {...
std::bitsetでコンパイル時にサイズ取れたら,テンプレート引数を1つにできるんですけどね.
0410402
NGNG最後の一行は撤回します.やっぱ無理でした.
替わりと言っちゃなんですが,
- typedef Bitset <myenum, myenum_size> myenums;
+ #define BITSET(arg) Bitset <arg, arg##_size>
+ typedef BITSET (myenum) myenums;
とすれば引数は一応減らせました.あんまり美しくないですけど.
0411デフォルトの名無しさん
NGNGtemplate<typename StdBitSet> struct size;
template<int Size> struct size<std::bitset<Size> >{enum{value=Size};}; // static const intを使うべきか?
こういう事?何の役に立つか分からんが。
0412411
NGNG0413デフォルトの名無しさん
NGNG「Pascalごときに負けられん.」とは厨房丸出しだな
その調子で部分範囲型も実装してみてくれよ
ちゃんと、部分範囲型は親の型と一方通行の互換性があって、
列挙以外に、整数や文字型にも使えるやつでよろしく頼む
あと、Adaじゃ文字型は当然列挙型なんで
enumで文字型も実装よろ
0414デフォルトの名無しさん
NGNGなんでそんなに偉そうなの???
0415デフォルトの名無しさん
NGNG負けられないなら
これぐらいは最低限要るという項目を挙げただけ
0416デフォルトの名無しさん
NGNGなんでわざわざ std::bitset つかうんだ?
operator | をサポートし、四則演算をサポートしないような
整数ラッパーを作ればいいだけだと思うが。
まぁ、ビットフラグは、
(幾つかのうちからひとつ)|(他の幾つかのうちから一つ)
みたない要求をされる場合もあるので、
あんまりがんばっても報われない(要求を満足できない)かもしれん。
0417402
NGNGまぁできることならリア厨に戻りたい今日この頃.orz
その「部分範囲型」ってのはPascalかい?
サンプルコードでも交えてもう少し詳しく解説よろしく.
それと最後のパラグラフの内容もC++しか知らん私には意味不明.
>>416
私自身はenumにこのスレで要求されてる機能を求めてはいないんですが,(383氏の考え方に近いです.)
まぁ頭の体操に.(笑)
bitset使ったのはビット長に制限ないのがいいかなと思いまして.
ってかそろそろスレ違いですかね?
0418デフォルトの名無しさん
NGNG横から解説させてもらうと、
部分範囲型は type From100To200 = 100..200; とか書けば100から200までしか代入できない型を作れる機能。
このときメモリサイズは最小のものを自動選択。この場合unsigned charかな。
(Pascalでは逆にCのintやlongに相当する予約語が無くて、整数は全部こうして使う。既定義のは当然あるけど)
で、整数以外にも既にあるenum T {A,B,C,D}にもtype T2 = B..C; とかできて、動作は上記同様。
これも大きい方から小さい方への代入はチェックが入る。
整数、enumの他、bool, 文字型も同様。type UpperAlphabet = 'A'..'Z'; とかできる。
そして上記の型すべて、setに使える。(setの下限は0に限らない)
templateでできそうなのを言語仕様に抱え込んで…とか思われるかもしれないが、
こういうのはリテラル定数の扱いにまで影響するので、内心templateでカバーできる範疇外と考えるけど
頭の体操は俺も好きなのでどんどんやってください。
0419デフォルトの名無しさん
NGNG要するに「厨房丸出し」の理屈に乗っかって
乞食やってるんですね ;-)
0420デフォルトの名無しさん
NGNGassert使えばいいのに・・・
0421デフォルトの名無しさん
NGNGNDEBUG定義したら消えてしまうassertをどう使ったら実装できる?
0422デフォルトの名無しさん
NGNG多次元型になった時点で、すでに意味を成せない。
0423デフォルトの名無しさん
NGNG>>422 Adaにはgenericがあるから複素数とかそれで実装されてる
0424デフォルトの名無しさん
NGNG既にあるか、無いなら価値なしと判断されたかのどっちかだ、きっと。
0425デフォルトの名無しさん
NGNGそれにC系の言語にはこんなもん無くても現に用は足りてるし
0426デフォルトの名無しさん
NGNG0427デフォルトの名無しさん
NGNGクスコ。
0428デフォルトの名無しさん
NGNG別に俺はPascal好きではないぞ、「設計思想の違い」と思ってる
charだろうが全部整数型で済ませるCの基本理念は
コンピュータの動作に忠実だし、便利といえば便利
数字でない文字型とか、部分範囲とか、別になくても困らないものを
わざわざ実装しないのも、利口ともいえる
そういう単純なモデルの中に、後付で列挙を入れたものだから
列挙がいまいちなのもあたりまえ
逆に、離散型という概念があり、その中にさらに整数と列挙を導入して、
という感じに哲学的概念から設計されてるのが、Pascalやその発展のAda
列挙でCに勝手あたりまえ
>>420
type num_letter = '0' .. '9' ;
var count_num_lentter : array [ num_letter ] of integer;
とか、範囲チェック以外にも使うのよ
Adaだと
for i in num_letter'range loop
...
end loop
とかループの範囲指定も出来るし
可読性・保守性をあげるのが主な目的と思う
0429デフォルトの名無しさん
NGNGなんで人間 (=プログラマー) が苦労せんといかんの ?
コンパイラーにやらせられることはコンパイラーにやらせようよ。
と言う発想なわけ。
反面、かったるいところも多いから、一長一短。
0430デフォルトの名無しさん
NGNGtemplate<int N>struct NI;
template<>struct NI<1>{ typedef unsigned char type; };
template<>struct NI<2>{ typedef unsigned short type; };
template<>struct NI<4>{ typedef unsigned int type; };
template<int MIN,int MAX>
class RangeInt{
typename NI<((MAX-MIN)>255) ? ((MAX-MIN)>65535) ? 4 : 2 : 1>::type value;
public:
RangeInt(int val=MIN){
if(val<MIN || val>MAX)
throw;
value=val-MIN;
}
operator int() const{ return value+MIN; }
};
RangeInt<5,10> ri=7; //5〜7までの整数型
0431デフォルトの名無しさん
NGNG>//5〜7までの整数型
↓
5〜10までの整数型を7で初期化
0432デフォルトの名無しさん
NGNGそれ環境依存じゃん
0433デフォルトの名無しさん
NGNGboost入ってない奴用に簡単に試せるのを出しただけ
CHAR_MAXとかは面倒だからはしょった
入ってる奴用
template<int MIN,int MAX>
class RangeInt{
typename boost::int_max_value_t<MAX-MIN>::least value;
public:
RangeInt(int val=MIN){
if(val<MIN || val>MAX)
throw;
value=val-MIN;
}
operator int() const{ return value+MIN; }
};
0434デフォルトの名無しさん
NGNG0435402
NGNG解説サンクス.413で厨房言われる理由が分かった.(冷汗)
これはもうちょい煽るか煽てるかしないと出ないよ.>>413
(「あおる」と「おだてる」は同じ字なんだね.)
0436402
NGNG418には「大きい方から小さい方への代入はチェックが入る。」とありますけど,
1. 「型」らしくコンパイル段階ではじく.
2. 例外.(ってあるの?)
3. 自動拡張.
3の場合は「型」っぽくないですが.
0437デフォルトの名無しさん
NGNG実行時で無いとわからないものは、実行時チェック。(勿論コンパイルオプションによりリリース時はチェックを省ける)
チェックに引っかかった場合、古典PascalならCのシグナルハンドラみたいな、Delphi,FreePascal等は例外
…なんですけども、Pascalの動作を真似る必要は無いと思います
0438デフォルトの名無しさん
NGNGただ、連想コンテナや標準のvectorあたりで十分フォローできる範囲な気がする。
constで飯が3杯食えるこのスレ的には、見て即エラーと分かり、
コンパイラがエラーですよと即警告してくれる、そのまんまのenumの使い道について
検証した方がいい気もする。
検証もへったくれも、答えは出きってるんじゃないかって感じだけどね。
要は外部からの入力の範囲を規定するのに、最小限の労力で「シンボル」を設定できて、
シンボルの範囲外を簡単に突っぱねられるtypedef enumマンセーだと言いたかったんだけど
それがこういう方向に膨らむとは考えてもみなかった。
面白いからもっとやろう。
0439デフォルトの名無しさん
NGNGalpha = ['A'..'Z', 'a'..'z'];
0440デフォルトの名無しさん
NGNG0441デフォルトの名無しさん
NGNG0442デフォルトの名無しさん
NGNG001 0x01 ^A 033 0x21 ! 065 0x41 A 097 0x61 a
002 0x02 ^B 034 0x22 " 066 0x42 B 098 0x62 b
003 0x03 ^C 035 0x23 # 067 0x43 C 099 0x63 c
004 0x04 ^D 036 0x24 $ 068 0x44 D 100 0x64 d
005 0x05 ^E 037 0x25 % 069 0x45 E 101 0x65 e
006 0x06 ^F 038 0x26 & 070 0x46 F 102 0x66 f
007 0x07 ^G 039 0x27 ' 071 0x47 G 103 0x67 g
008 0x08 ^H 040 0x28 ( 072 0x48 H 104 0x68 h
009 0x09 ^I 041 0x29 ) 073 0x49 I 105 0x69 i
010 0x0a ^J 042 0x2a * 074 0x4a J 106 0x6a j
011 0x0b ^K 043 0x2b + 075 0x4b K 107 0x6b k
012 0x0c ^L 044 0x2c , 076 0x4c L 108 0x6c l
013 0x0d ^M 045 0x2d - 077 0x4d M 109 0x6d m
014 0x0e ^N 046 0x2e . 078 0x4e N 110 0x6e n
015 0x0f ^O 047 0x2f / 079 0x4f O 111 0x6f o
016 0x10 ^P 048 0x30 0 080 0x50 P 112 0x70 p
017 0x11 ^Q 049 0x31 1 081 0x51 Q 113 0x71 q
018 0x12 ^R 050 0x32 2 082 0x52 R 114 0x72 r
019 0x13 ^S 051 0x33 3 083 0x53 S 115 0x73 s
020 0x14 ^T 052 0x34 4 084 0x54 T 116 0x74 t
021 0x15 ^U 053 0x35 5 085 0x55 U 117 0x75 u
022 0x16 ^V 054 0x36 6 086 0x56 V 118 0x76 v
023 0x17 ^W 055 0x37 7 087 0x57 W 119 0x77 w
024 0x18 ^X 056 0x38 8 088 0x58 X 120 0x78 x
025 0x19 ^Y 057 0x39 9 089 0x59 Y 121 0x79 y
026 0x1a ^Z 058 0x3a : 090 0x5a Z 122 0x7a z
027 0x1b ^[ 059 0x3b ; 091 0x5b [ 123 0x7b {
028 0x1c ^\ 060 0x3c < 092 0x5c \ 124 0x7c |
029 0x1d ^] 061 0x3d = 093 0x5d ] 125 0x7d }
030 0x1e ^^ 062 0x3e > 094 0x5e ^ 126 0x7e ~
031 0x1f ^_ 063 0x3f ? 095 0x5f _ 127 0x7f
0443デフォルトの名無しさん
NGNG0444デフォルトの名無しさん
NGNG0445デフォルトの名無しさん
NGNG範囲そのものを、配列の範囲につかって
var count_teenager : array [ 13 .. 19 ] of integer;
とやる代わりに、
type teen = 13 .. 19;
var count_teenager : array teen of integer;
とかやったり、
Adaなら
for i in teen'range loop
...
end loop;
とかやって、可読性をあげるのも大きな目的であってだな
単なるレンジチェック付きの型じゃねえし
単なるレンジチェック付きの型なら、それこそassertの類で十分
0446デフォルトの名無しさん
NGNGあくまでC++で、静的にあれこれどこまで迫れるかであって、文法上そもそも無理があるのはわかり切った事だっての
0447デフォルトの名無しさん
NGNGインデクスの値そのものが大事なら連想コンテナ使おう!
0448デフォルトの名無しさん
NGNGinline State operator |(State a, int b) { return (State)((int)a|b); }
みたいのは良く書くが
switch 〜 case の case に書くとコンパイルエラーになるのが鬱。
0449デフォルトの名無しさん
NGNG0450デフォルトの名無しさん
NGNGJavaにはなんかそんなのあったな。
0451デフォルトの名無しさん
NGNG''';;';'';';''';;'';;;,., ザッ
ザッ ;;''';;';'';';';;;'';;'';;;
;;'';';';;'';;';'';';';;;'';;'';;;
vymyvwymyvymyvy ザッ
ザッ MVvvMvyvMVvvMvyvMVvv、
Λ_ヘ^−^Λ_ヘ^−^Λ_ヘ^Λ_ヘ
ザッ ヘ__Λ ヘ__Λ ヘ__Λ ヘ__Λ
__,/ヽ_ /ヽ__,.ヘ /ヽ__,.ヘ _,.ヘ ,.ヘ ザッ
/\___/ヽ /\___ /\___/ヽ _/ヽ /\___/ヽ
/'''''' '''''':::::::\/'''''' '''/'''''' '''''':::::::\ /'''''' '''''':::::::\
. |(●), 、(●)、.:|(●), |(●), 、(●)、.:|、( |(●), 、(●)、.:|
| ,,ノ(、_, )ヽ、,, .::::| ,,ノ(、_, )| ,,ノ(、_, )ヽ、,, .::::|_, )| ,,ノ(、_, )ヽ、,, .::::| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
. | `-=ニ=- ' .:::::::| `-=ニ= | `-=ニ=- ' .:::::::|ニ=| `-=ニ=- ' .:::::::| < ageますよ
\ `ニニ´ .:::::/\ `ニニ \ `ニニ´ .:::::/ニ´ \ `ニニ´ .:::::/ \_________
/`ー‐--‐‐―´\ /`ー‐- /`ー‐--‐‐―´\-‐‐ /`ー‐--‐‐―´\
0452デフォルトの名無しさん
NGNG''';;';'';';''';;'';;;,., ザッ
ザッ ;;''';;';'';';';;;'';;'';;;
;;'';';';;'';;';'';';';;;'';;'';;;
vymyvwymyvymyvy ザッ
ザッ MVvvMvyvMVvvMvyvMVvv、
Λ_ヘ^−^Λ_ヘ^−^Λ_ヘ^Λ_ヘ
ザッ ヘ__Λ ヘ__Λ ヘ__Λ ヘ__Λ
__,/ヽ_ /ヽ__,.ヘ /ヽ__,.ヘ _,.ヘ ,.ヘ ザッ
/\___/ヽ /\___ /\___/ヽ _/ヽ /\___/ヽ
/'''''' '''''':::::::\/'''''' '''/'''''' '''''':::::::\ /'''''' '''''':::::::\
. |(●), 、(●)、.:|(●), |(●), 、(●)、.:|、( |(●), 、(●)、.:|
| ,,ノ(、_, )ヽ、,, .::::| ,,ノ(、_, )| ,,ノ(、_, )ヽ、,, .::::|_, )| ,,ノ(、_, )ヽ、,, .::::| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
. | `-=ニ=- ' .:::::::| `-=ニ= | `-=ニ=- ' .:::::::|ニ=| `-=ニ=- ' .:::::::| < s ageますよ
\ `ニニ´ .:::::/\ `ニニ \ `ニニ´ .:::::/ニ´ \ `ニニ´ .:::::/ \_________
/`ー‐--‐‐―´\ /`ー‐- /`ー‐--‐‐―´\-‐‐ /`ー‐--‐‐―´\
0453マイク ◆yrBrqfF1Ew
NGNG食えるわけねえだろが。
0454デフォルトの名無しさん
NGNG0455デフォルトの名無しさん
NGNG0456デフォルトの名無しさん
NGNG0457デフォルトの名無しさん
NGNG全く予想もしないようなパラメータ結合してて
理解不能なバグになることがある
constでハマったらconst_castなんて言ってるうちは素人
0458デフォルトの名無しさん
NGNGfoo(const int &v);
でオーバーロードして挙動を変えて
生意気な後輩(先輩でも可)をびびらせるというのはどうだろう。
0459名無しさん@Vim%Chalice
NGNGそのオーバーロード出来るって知らなかった。びびった。スマン。
これやられたら const 付けるようになりそうだな…
0460デフォルトの名無しさん
NGNG0461デフォルトの名無しさん
NGNG>>459
チョメ。
こっちは問題ないだろうと思うけど、fooへの参照を返す関数に
const foo& bar() const
foo& bar()
の2パターン用意する意義はわかってるよね?
0462デフォルトの名無しさん
NGNG参照の戻り値が変更される場合ってどんなの?
0463デフォルトの名無しさん
NGNGわかりやすい例だと、
foo & operator[](int)
とか。
0465デフォルトの名無しさん
NGNG0466デフォルトの名無しさん
NGNGそうじゃなくてさ、
class hoge
{
public:
hoge& operator[](size_t n);
const hoge& operator[](size_t n) const;
};
非constオブジェクトでは好きに書き換えられるようにするけど、constオブジェクトでも読取限定でoperator[]を使わせたいとか、
あるいはconst版をpublic、非const版をprivateにするとかそういう用途に。
0467デフォルトの名無しさん
NGNG確かにこれ両方ないと、const な map は [] で中身見ることすらできなくなるね。
0468デフォルトの名無しさん
NGNG見れないのが普通では?
0469デフォルトの名無しさん
NGNG???
0470デフォルトの名無しさん
NGNG#include <map>
using namespace std;
typedef map <int, float> Map;
int main () {
const Map m0;
m0 [3]; // <- エラー
const_cast <Map &> (m0) [3]; // <- OK
return 0;
}
0471デフォルトの名無しさん
NGNGmap にはないのはどういう理由なんだろう・・・
例によって例外関連?
0472デフォルトの名無しさん
NGNGそのキーに対して Value() が勝手に挿入されてしまうから。
map.find() を使え。
0473デフォルトの名無しさん
NGNG超納得。
ある意味とても教科書的な「悪い」constオーバーロード実装例でつね。
0474デフォルトの名無しさん
NGNG相変わらずお前は意味不明なレスをするんだな
0475デフォルトの名無しさん
NGNGそれはそれでまた当然文句をいうのも473。
0476デフォルトの名無しさん
NGNG悪いというよりは、C++の文法的な問題が絡んでいるのでは。
つまり、map[] = a という代入は operator [] ⇒ operator = という2ステップで処理されるので、
最初の operator [] は Value& を返さざるを得ない。
よって、operator [] で存在しないキーが指定された場合も、
参照だけでなく代入される恐れがあるので、どこかに実体を保持しておく必要がある。
だから、勝手に新しいValueが挿入される。
C# インデクサや、VC++ の __declspec(property) 方言のような、
map[key] = value ⇒ map.insert(key, value) 的な書き換えをしてくれたら、
参照と代入が明確に分離するので、const [] も可能だっただろう。
実は、C++だけでも、プロキシオブジェクトを返すようにすれば
const [] に対応することもできたはずなんだが……なぜそうならなかったのかは知らない。
0477デフォルトの名無しさん
NGNG> const []
対応する要素が無かったらどうするの?例外?
0478デフォルトの名無しさん
NGNG代入のときは挿入して、参照のときは挿入せずに Value() を返す。
0479デフォルトの名無しさん
NGNG0480デフォルトの名無しさん
NGNGconst [] の戻り値に代入は無いよな?
それに、 Value() を返すってことは、参照したときの戻り値は参照型じゃないってことになるのか?
0481デフォルトの名無しさん
NGNGああ、言い方が悪かった。
non-const [] は、参照と代入の機能を持つプロキシオブジェクトを返し、
const [] は、参照機能だけを持つプロキシオブジェクトを返せばいい。
0482デフォルトの名無しさん
NGNG> Value() を返すってことは、参照したときの戻り値は参照型じゃないってことになるのか?
YES。
例外を投げない const [] を実現するためには、
存在しないキーが指定された場合に挿入することなく Value() を返すため、
値戻しになることは避けられない。
戻り値に参照型を使う場合は、どこかに実体を保持しなければならないから。
んで、値戻しだと代入(map[] = k)ができなくなってしまうので、
プロキシを介して、参照か代入かが判明するまで評価を遅らせる必要がある。
これが、プロキシを使えば〜の意味。
0483デフォルトの名無しさん
NGNGconst YourMap<const char *, int> m; /* empty map */
int x = m[3];
これはどうなると意図している?
0484483
NGNG0485デフォルトの名無しさん
NGNGってことは、
map<int,value_type> const m;
value_type const& v1 = m[0];
value_type const& v2 = m[0];
としたとき、 &v1 != &v2 なわけだな。ちょっと気になるな。
operator [] でプロキシを返すと、
map<int,map<int,int> > const m;
int n = m[0].size();
こんなんできなくなりそう。
> const [] に対応することもできたはずなんだが……なぜそうならなかったのかは知らない。
要素が無かった場合への対応がいろいろ考えられるし、
std::map自身の立場ではどれが一般的とも言えないからでしょ。
たとえば>>482のような対応が常に正解とは言えないし、
そういう対応が適している場合には、std::mapを拡張して実装すればいい。
こんなこというと、 operator [] 自体がダメだったとも言えるけど、
実際のところダメだったんじゃないかと思う。
0486デフォルトの名無しさん
NGNGよってプロキシクラスに参照機能なんて持たせられない。
0487デフォルトの名無しさん
NGNGそれらは実現できないな。
ポインタ格納専用でよいなら、
見つからない場合はNULLが変えるのは妥当だし、
プロキシの operator -> () をオーバーロードできるから、
それなりに使いやすいかも。
0488デフォルトの名無しさん
NGNG> 見つからない場合はNULLが変えるのは妥当だし、
> プロキシの operator -> () をオーバーロードできるから、
それ、std::mapにイテレータでアクセスすれば同じことじゃない?
0489デフォルトの名無しさん
NGNG0490デフォルトの名無しさん
NGNG''';;';'';';''';;'';;;,., ザッ
ザッ ;;''';;';'';';';;;'';;'';;;
;;'';';';;'';;';'';';';;;'';;'';;;
vymyvwymyvymyvy ザッ
ザッ MVvvMvyvMVvvMvyvMVvv、
Λ_ヘ^−^Λ_ヘ^−^Λ_ヘ^Λ_ヘ
ザッ ヘ__Λ ヘ__Λ ヘ__Λ ヘ__Λ
__,/ヽ_ /ヽ__,.ヘ /ヽ__,.ヘ _,.ヘ ,.ヘ ザッ
/\___/ヽ /\___ /\___/ヽ _/ヽ /\___/ヽ
/'''''' '''''':::::::\/'''''' '''/'''''' '''''':::::::\ /'''''' '''''':::::::\
. |(●), 、(●)、.:|(●), |(●), 、(●)、.:|、( |(●), 、(●)、.:|
| ,,ノ(、_, )ヽ、,, .::::| ,,ノ(、_, )| ,,ノ(、_, )ヽ、,, .::::|_, )| ,,ノ(、_, )ヽ、,, .::::| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
. | `-=ニ=- ' .:::::::| `-=ニ= | `-=ニ=- ' .:::::::|ニ=| `-=ニ=- ' .:::::::| < ageますよ
\ `ニニ´ .:::::/\ `ニニ \ `ニニ´ .:::::/ニ´ \ `ニニ´ .:::::/ \_________
/`ー‐--‐‐―´\ /`ー‐- /`ー‐--‐‐―´\-‐‐ /`ー‐--‐‐―´\
0491デフォルトの名無しさん
NGNG''';;';'';';''';;'';;;,., ザッ
ザッ ;;''';;';'';';';;;'';;'';;;
;;'';';';;'';;';'';';';;;'';;'';;;
vymyvwymyvymyvy ザッ
ザッ MVvvMvyvMVvvMvyvMVvv、
Λ_ヘ^−^Λ_ヘ^−^Λ_ヘ^Λ_ヘ
ザッ ヘ__Λ ヘ__Λ ヘ__Λ ヘ__Λ
__,/ヽ_ /ヽ__,.ヘ /ヽ__,.ヘ _,.ヘ ,.ヘ ザッ
/\___/ヽ /\___ /\___/ヽ _/ヽ /\___/ヽ
/'''''' '''''':::::::\/'''''' '''/'''''' '''''':::::::\ /'''''' '''''':::::::\
. |(●), 、(●)、.:|(●), |(●), 、(●)、.:|、( |(●), 、(●)、.:|
| ,,ノ(、_, )ヽ、,, .::::| ,,ノ(、_, )| ,,ノ(、_, )ヽ、,, .::::|_, )| ,,ノ(、_, )ヽ、,, .::::| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
. | `-=ニ=- ' .:::::::| `-=ニ= | `-=ニ=- ' .:::::::|ニ=| `-=ニ=- ' .:::::::| < ageますよ
\ `ニニ´ .:::::/\ `ニニ \ `ニニ´ .:::::/ニ´ \ `ニニ´ .:::::/ \_________
/`ー‐--‐‐―´\ /`ー‐- /`ー‐--‐‐―´\-‐‐ /`ー‐--‐‐―´\
0492デフォルトの名無しさん
NGNG''';;';'';';''';;'';;;,., ザッ
ザッ ;;''';;';'';';';;;'';;'';;;
;;'';';';;'';;';'';';';;;'';;'';;;
vymyvwymyvymyvy ザッ
ザッ MVvvMvyvMVvvMvyvMVvv、
Λ_ヘ^−^Λ_ヘ^−^Λ_ヘ^Λ_ヘ
ザッ ヘ__Λ ヘ__Λ ヘ__Λ ヘ__Λ
__,/ヽ_ /ヽ__,.ヘ /ヽ__,.ヘ _,.ヘ ,.ヘ ザッ
/\___/ヽ /\___ /\___/ヽ _/ヽ /\___/ヽ
/'''''' '''''':::::::\/'''''' '''/'''''' '''''':::::::\ /'''''' '''''':::::::\
. |(●), 、(●)、.:|(●), |(●), 、(●)、.:|、( |(●), 、(●)、.:|
| ,,ノ(、_, )ヽ、,, .::::| ,,ノ(、_, )| ,,ノ(、_, )ヽ、,, .::::|_, )| ,,ノ(、_, )ヽ、,, .::::| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
. | `-=ニ=- ' .:::::::| `-=ニ= | `-=ニ=- ' .:::::::|ニ=| `-=ニ=- ' .:::::::| < ageますよ
\ `ニニ´ .:::::/\ `ニニ \ `ニニ´ .:::::/ニ´ \ `ニニ´ .:::::/ \_________
/`ー‐--‐‐―´\ /`ー‐- /`ー‐--‐‐―´\-‐‐ /`ー‐--‐‐―´\
0493デフォルトの名無しさん
NGNGintだろうがfloatだろうが引数には絶対constをつけたくなるんですが、
これはconst病ですか?
0494デフォルトの名無しさん
NGNGchar* strcpy_special( char* out_str , const char* in_str );
char* strcpy_special( char* out_str , const char* in_str )
{
strcpy( out_str , "in_str" );
strcpy( const_cast<char*>in_str , "世の中そんなに甘くないよ。");
return 0;
}
0495デフォルトの名無しさん
NGNGそのconstは宣言において意味が無い。それでも付けたくなるようなら病気かも。
0496デフォルトの名無しさん
NGNG「constをたくさん使いたい人は、VC++を使うべし」
void f(const const const char const * const p) { ... }
これがエラーにならずにコンパイルできるのは、上記3つの中ではVC++だけだった。
gccは.cなら警告のみだが、.cppだとエラーになる。
bccは.cでもエラーになる。
もう一度。
「constをたくさん使いたい人は、VC++を使うべし」
0497デフォルトの名無しさん
NGNGC++ FDIS 7.1.5 - Type specifiers [dcl.type] より、引用。
"redundant cv-qualifiers are prohibited except when introduced through the use of typedefs or template type arguments, in which case the redundant cv-qualifiers are ignored."
「重複するcv指定は、typedefまたはtemplate引数を介した(無視される)場合を除いて禁止されている。」
VC++がユルい。
0498デフォルトの名無しさん
NGNG>そのconstは宣言において意味が無い。
意味はあるんですけど。
0499デフォルトの名無しさん
NGNG定義においては確かに意味があるが、宣言においては無い。
0500デフォルトの名無しさん
NGNGauto変数にも積極的にconstを付けようというのであれば、その一環として、値渡し
の引数にconstを付けるのもアリだと思う。関数の外には何も影響はないけれど。
0501デフォルトの名無しさん
NGNGこれ、揚げ足取りみたいだけど現実なんだよな。
初めてみたときビビったよ。
なんでそんな振る舞いになってるんだろ?
0502デフォルトの名無しさん
NGNG関数宣言をインターフェースとして使う側から見たとき、
それらの2つに違いがないからだろう。
こういうのはconstに限らず、配列引数→ポインタ引数みたいな同一視は元のC言語にも有った。
また、もしこんなオーバーロードが有効だとすると、
int f(int);
int f(int const);
こんなコードを
int x = 1;
f(x);
const大好きなプログラマがこう変えたりすると、
int const x = 1;
f(x);
呼び出される関数が変わりうることになる。
怖すぎるし、納得いかない。
0503デフォルトの名無しさん
NGNG0504デフォルトの名無しさん
NGNGむしろ値渡しのみにして
あとはコンパイラでよろしくやってもらう方がいい
0505デフォルトの名無しさん
NGNGその為には引数は常にread-onlyになるけど。
0506デフォルトの名無しさん
NGNG引数のconstは関数の内側の問題なのに、
それが関数外側のオーバーロードの解決ルールに
適用されちゃうことになっては本末転倒だから、ていうこと?
そうして考えれば、値渡し参照渡しは問題の本質じゃないんだな。
0507デフォルトの名無しさん
NGNG引数が複数とれるなら、戻り値も複数とれるようにするべきだよな。
( s0, s1, s2 ) = f( a0, a1, a2 )
そうすりゃ引数で参照渡しなんてトリッキーは方法は 使う必要がなくなる。
0508デフォルトの名無しさん
NGNG構造体……。
0509デフォルトの名無しさん
NGNG0510デフォルトの名無しさん
NGNGboost::tuple(std::pair) + boost::tieなんかもどうでしょ?
509の問題が依然として残りますけど.
0511デフォルトの名無しさん
NGNGboost::tuple だったらコピーが発生しないから良いんじゃない?
0513デフォルトの名無しさん
NGNG↓
戻り値複数にすれば解決!!
つー流れだから、boost::tuple云々はちと違うような。
しかし便利そうではあるな。
0514デフォルトの名無しさん
NGNG0515デフォルトの名無しさん
NGNGどこが違う?
>>512
tieは普通の代入と変わらない。
0516デフォルトの名無しさん
NGNGDelphiだと戻り値に構造体返すと
代入先に直接書き込まれるから無駄なコピーは発生しないよ。
だから言語仕様とコンパイラの最適化次第だと思うけど。
0517デフォルトの名無しさん
NGNG例えばファイルか何かを読み込んで英単語の出現頻度を数えて、
既存の std::map< std::string, int > に追加していくような関数:
void update_word_table(std::map< std::string, int >& table);
みたいなものは、参照無くなったらどういう実装がよいと思う?
参照の使いどころは戻り値だけじゃないし・・・
ポインタで十分ですよ、という意見ならある程度同意できるけど。
0518デフォルトの名無しさん
NGNGC++でも、大抵の処理系でPODの場合はそうなる。
ただ、コピーコンストラクタを実装してたり内部にオブジェクトを保持した
構造体(クラス)を返すと、一時オブジェクトが作られる。
0519デフォルトの名無しさん
NGNGstruct hoge f(void) {}
は、実際には、最適化されて
void f(struct hoge *p) {}
と同様の処理になるのが殆ど。
0520デフォルトの名無しさん
NGNGなるほど。でもそれだと、
>戻り値複数にすれば解決!!
に対する疑問だよな?
>参照無くなったらどういう実装がよいと思う?
void update_word_table(boost::function<void (std::string, int)> inserter);
かな。挿入だけじゃなくて色々やるならmapをじかに扱うんじゃなくてクラスに入れる。
0521デフォルトの名無しさん
NGNGpublic:
virtual int get_prop() const { return 0; }
};
のget_propをオーバーライドしようとして
class Derived : public Base {
public:
virtual int get_prop() { return 100; }
}
とやって半日悩んだ。
0522デフォルトの名無しさん
NGNG0523デフォルトの名無しさん
NGNG俺もやったわ。
それも今日。
ぬるぽ。
>>522
RTTIチックなことする場合でもconstつけないと、君は!
0524デフォルトの名無しさん
NGNGかれこれ5ヶ月。
0525デフォルトの名無しさん
NGNG漏れはもうパフォーマンス上の問題は表面化してから考える
プロファイル至上主義に切り替えて、豪快にクラスも構造体も
ガバガバコピーしまくり返り値にしまくりなんだけど、
実際にRVOってどの程度まで効いてるもんなんだろね。
コピーやコンストラクションに変な副作用のない
(staticメンバで生成数をカウントしてるとか)限りは、
確かに大抵のコンパイラで思ってたよりも遥かに気を
まわしてくれてるみたいだけど、盲信するのも微妙な気がするし。
VC7だったかが、中身がfloat3つの簡単なの三次元ベクトルのクラス
(もちろんoperatorで四則演算返り値返しまくり)3つを
足したり引いたり外積かけまくったりして、最終的に3行3列の
マトリクスにしたものを更に値で返す手抜き関数を書いて
逆アセしたら、しれっと返り値の格納先の3行3列の9パラメータを
直接初期化する式に全展開されてて愕然としたことがあるけど、
(それどころか使った三次元ベクトルクラスを定数展開できるとみるや
9個のfloatで直接初期化する芸当までやってのけてた)
これはそれなりに恵まれた例だろうし。
でも、一々細かいこと気にして生産性落とすのも、この時代ナンセンスですかね。
0526デフォルトの名無しさん
NGNG0527デフォルトの名無しさん
NGNG宣言にとっては意味無し。
定義にとっては意味がないこともないけど俺は付けない。
0528デフォルトの名無しさん
NGNG副作用を持つ非 const なメンバを持つクラスなら普通に有意味。
でも普通そんな引数は const 参照にするだろうから、結局無意味か。
0529526
NGNG> 定義にとっては意味がないこともない
詳細キボンです
>>528
あー、確かに… 仮引数をクラスへのconst参照にしたら
その関数内部からはconstメンバ関数しか呼べないですし、
(publicな)メンバ変数ならreadしかできませんね…
そもそも仮引数にconstを付けるのって、呼び出し側に
「中身を書き換えませんよ〜」って知らせてあげる効果がありますよね
基本型(int/char等)でも集合型(struct/class)でも値引数ならコピーされるから
呼び出し側は渡した実引数を変更される心配をしないですよね?
なので、中身を書き換えられる心配は無いのだから
わざわざconstつけなくても良いのでは… ということです
現実的には、コピーするとコストかかっちゃうから、
基本型じゃなければ、おっしゃる通りに参照(とかポインタ)にするでしょうし、
更に関数内で書き換えない場合はそれを呼び出し側に知らせるためにもconstにすると思います
# 実際に関数内でconst引数の中身を書き換える操作をしようとすれば
# コンパイルエラーになりますし
長文スマソ
0530デフォルトの名無しさん
NGNG定義時にはローカル変数にconstつけるのと同じ意味になる。
宣言においてはほんとに意味が無い。
宣言にconst付いてなくても、定義時につけることができる。
逆に宣言にconstがついてても、定義時につけないこともできる。
0531526
NGNG解説サンクスです。
> 定義時にはローカル変数にconstつけるのと同じ意味になる。
確かにそのようです。
> 宣言にconst付いてなくても、定義時につけることができる。
> 逆に宣言にconstがついてても、定義時につけないこともできる。
試してみましたが、どっちもほんとにコンパイル通りますね。ちょっと驚き。
どっちも定義の方が有効になってるようです。
> 宣言においてはほんとに意味が無い。
なんでこういう仕様なんでしょうね?
普通に考えれば宣言と定義は一致してないとコンパイル通らなくていいはずなのに…
ヘッダファイルはいつもconst付けずに書いておき、
必要なら実装ファイルだけconstの付加/削除ができるってことですね。
ヘッダが変更されると一般にコンパイル時間が長くなるから
それを避けつつ変更できるような意図があるのかなぁ?
0532デフォルトの名無しさん
NGNG0533デフォルトの名無しさん
NGNG0534デフォルトの名無しさん
NGNG他人が読むと「ハァ?」と考えてしまうことがあるだろう
0535デフォルトの名無しさん
NGNG0536デフォルトの名無しさん
NGNGconst int HIRUMESHI = 2;
const int YUMESHI = 3;
0537デフォルトの名無しさん
NGNG他人が読むと「ハァ?」と考えてしまうことがあるだろう
0538デフォルトの名無しさん
NGNGconst int HIRUMESHI = 2; //なぜだ?さっぱりわけわからん。気分転換にシだ。
const int YUMESHI = 3; //あそこのconstのせいで1日が消えちまった。気が付きゃメシの時間じゃないか。鬱ダシノウ。
0539デフォルトの名無しさん
NGNG自明な変数ならコメントは要らないがな
0540デフォルトの名無しさん
NGNGどんなケース?
0541デフォルトの名無しさん
NGNG0542デフォルトの名無しさん
NGNG他人が読むと「ハァ?」と考えてしまうことがあるだろう
と、言いたい。
0543デフォルトの名無しさん
NGNG>>458や>>459のようなオーバーロードをした上、2つの関数のやることが全く違っていれば間違いなくはまる。
0544デフォルトの名無しさん
NGNGスポポーン。そんな奴いねーよ。
0545デフォルトの名無しさん
NGNGJava野郎が調子にのってC++始めて const ではまるケース。
0546デフォルトの名無しさん
NGNGint i=1;
foo(i)
foo(1)
で挙動が変わるって事ですか?
それは正直、関数作った奴が悪いかと・・・
0547デフォルトの名無しさん
NGNG実際そんな馬鹿な仕様はまともなOOPLじゃ採用されてないし。
0548デフォルトの名無しさん
NGNG0549デフォルトの名無しさん
NGNG0550デフォルトの名無しさん
NGNGC++はまともなOOPLじゃないもん。
いや、良い意味で。
0551s
NGNGConstJava
ttp://pag.lcs.mit.edu/constjava/
0552デフォルトの名無しさん
NGNG0553デフォルトの名無しさん
NGNG0555デフォルトの名無しさん
NGNGなんかスレが止まり出したよな…。
誰かconstの話キボンヌ
0556デフォルトの名無しさん
NGNG書こうとしてしまったコード。
template<typename T>
struct Container {
void setItem (const T item) { /* 省 (゚Д゚) 略 */ }
};
Container<char *> container;
container.setItem("item"); // くそったれ!
0558551
NGNGというかそれをやらずしてconstをJavaに加える意味がないんだけど…
非staticのインナークラスのコンストラクタが constコンストラクタにできたり,
例外のthrowにconstを使えなかったり,
templateを使ってconst/非constバージョンのメソッドが使えたり,
constが付いてない既存ライブラリに後付けでconst指定できたり,いろいろ.
Javaとの協調も全然可能(らしい).
まぁ今のところ1プロジェクトに過ぎないんだけど, 既に実装があるのが良い.
#まだ試してないし,pdfも全部読んだわけではないのだけど,とりあえず紹介をば.
0559デフォルトの名無しさん
NGNG概念的constってナーニ?
0560551
NGNGよく言われるのは,
C++のconstメンバ関数内では,メンバ変数のビットを変更することはできないけど,
メンバ変数の参照先を変更することはできてしまう.
このようにC++では
概念的constとビットのconstがごちゃまぜになっていると言われます.確か.
>>321で言われているようなことが言いたかった.
ConstJavaでは,
constメソッドはフィールドを変更することもフィールドが参照している別のオブジェクトを変更することもできなくなっている.
前者は従来のJavaにおけるfinal, 後者はいわゆる概念的const.
0561デフォルトの名無しさん
NGNG0562デフォルトの名無しさん
NGNGはずしまくってたらゴメン。
よくわからんけど、メンバが指している先が自分に所属するとは限らないのだから一律読み取り専用にするのは const の理念とは違うと思う。
さらにオブジェクトはグローバル変数などの外部の要因によっても動作を変えるのだから、
インスタンス変数だけでなくて、ファイルスコープ変数、クラス変数、グローバル変数、引数などもすべて読み取り専用にしないと意味が無い。
そうなると、(概念的?)const メソッドは、外部に一切の変更を加えることができなくなるのだから、
それは const というよりは nosideeffect とかそんな感じだと思う。
0563デフォルトの名無しさん
NGNGgcc の関数 attribute 、pure/const あたりがそれだな。
0564551
NGNG>ファイルスコープ変数,…(略)…,などもすべて読み取り専用にしないと意味が無い。
あるオブジェクトを指す参照がconst参照しか存在しない場合,そのオブジェクトは不変であることが言語により保証される.らしい.(後述)
結局,そういう「限定的な」不変性の保証こそがconstの目的かと.
ConstJava does not place any guarantee on object immutability.
However, if only constant references to a given object exist (a constant reference is one through which an object cannot be mutated),
then the object is immutable.
>nosideeffect
constjavaが'const'キーワードを用いているのは単にC++からの類推であり,
意味的は確かに単語'const'(定数とか不変とか)とはちょっと違うモノかもしれない.
>>563
http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html
これか.すげー.知らなかった…(よく見ると>>296でも言われていた…)
0565デフォルトの名無しさん
NGNG0566デフォルトの名無しさん
NGNG組み込みROM環境へいらっしゃいませ。
0567デフォルトの名無しさん
NGNG(俺が見かけるだけで実際は知らない)
NP > BH > 色 > Rev > CS > FL > Prima > その他
0568デフォルトの名無しさん
NGNG{
a = 0;
}
は、コンパイラ側で
void hoge( int* a )
{
*a = 0;
}
に変換されて動作していると考えていいのでしょうか?
0569デフォルトの名無しさん
NGNG多分そうだけど、絶対そうだとは言えない。
0570デフォルトの名無しさん
NGNG0571デフォルトの名無しさん
NGNG{
*a = 0;
}
は、コンパイラ側で
void hoge( int& a )
{
a = 0;
}
に変換されて動作していると考えていいのでしょうか?
0572デフォルトの名無しさん
NGNG多分変換されないけど、絶対されないとは言えない。
0573デフォルトの名無しさん
NGNG0574デフォルトの名無しさん
NGNG0575デフォルトの名無しさん
NGNG(俺が見かけるだけで実際は知らない)
NP > BH > 色 > Rev > CS > FL > Prima > その他
0576デフォルトの名無しさん
NGNGうざいだけ。
0577Rubysaikyou!!!!!!!!!!!!1
NGNG0578デフォルトの名無しさん
NGNGconstを意識しない奴、ウゼー
0579デフォルトの名無しさん
NGNGconst うざいのはわかるけど、
const 使わないのをうざったがるのはどうして?
0580デフォルトの名無しさん
NGNGPoint とかのシンプルな値を返すときも参照返しだから書きかえられちゃう。
使いづらくってしょうがない。
0581デフォルトの名無しさん
NGNG保守性
0582デフォルトの名無しさん
NGNGファイル名受け取る関数書かせたら引数の型が char* だったりするわけよ。
文字列リテラル渡したいだけで警告やらエラーやらをキャストで潰さないといけない。
0583デフォルトの名無しさん
NGNGそのまえに、その関数書いたバカをとっととシバキたおせよ。。。
0584デフォルトの名無しさん
NGNG文盲?
それが「constを意識しない奴」だろ。
0585デフォルトの名無しさん
NGNGそれ、使い方が違ってるだけだろ。
リテラルオブジェクトへの直接の参照を書き換え不可の属性つけてやりとりするC++と違って、
リテラルオブジェクトとまったく同じ内容をコピーした別オブジェクトをやりとりするのがJava流、
オブジェクトへの操作と、オブジェクトの内容物の直接操作とを明確に区別してるだけのこと。
オブジェクトの物理的な居場所を剥き出しにしていて、const無しでは何をするにも危険な
(その分パフォーマンス的に有利な)C++とは、言語の位置づけ自体があまりにも違いすぎる。
Java使ってるなら、実体を返すか参照を返すかは区別せんと。
0586デフォルトの名無しさん
NGNGJavaって実体を返せたっけ?
0587デフォルトの名無しさん
NGNG…言い回しが面倒ちいなあ。
0588デフォルトの名無しさん
NGNG0589デフォルトの名無しさん
NGNG「実体への間接的な参照」ってことは、
「実体への直接的な参照」と
「実体への間接的な参照」があるってこと?
単に「参照」っていうのとはどう違うの?
0590マイク ◆yrBrqfF1Ew
NGNG良いと言う事だろ。
0591デフォルトの名無しさん
NGNGC++も参照先を後から変更できるようにすれば良いんだけどね。
この馬鹿みたいな仕様で参照が使えない場面ってのが多いこと多いこと。
0592デフォルトの名無しさん
NGNG0593デフォルトの名無しさん
NGNG参照先を変えるのか参照先への代入なのか分からないから
そうなっちゃうんだろうけど
0594デフォルトの名無しさん
NGNG緩める方向への変更だから互換性も問題ないし。
0595デフォルトの名無しさん
NGNG('A`)
0596デフォルトの名無しさん
NGNG0598デフォルトの名無しさん
NGNGFuga& m_fuga;
public:
Hoge() : m_fuga( 0 ) {
}
void SetFuga( Fuga& fuga ) {
renew_reference( m_fuga, fuga );
}
};
こんな感じの構文になるんだろうか。
0599デフォルトの名無しさん
NGNGポインタでいいじゃん
0600デフォルトの名無しさん
NGNGだな。
アホかと。
そんなもん標準で出来るようにしろと。
0601デフォルトの名無しさん
NGNGたまには他の言語も使ってみたら
0602デフォルトの名無しさん
NGNG0603デフォルトの名無しさん
NGNG変えたいんならポインタ使えばいいんだし。
0604デフォルトの名無しさん
NGNGconstポインタ使え
0605デフォルトの名無しさん
NGNGお前、頭悪いだろ
0606デフォルトの名無しさん
NGNGconst参照とそうでない参照に分けるべきだと思う。
constポインタの場合、const_castで非constに出切るけど、参照の場合どうしようもない。
遅延初期化やserializationとかで困る。
0607デフォルトの名無しさん
NGNGにしろと?
0608デフォルトの名無しさん
NGNG「const参照」「そうでない参照」の意味がわからん。
T const& と T& のことか?
「constポインタ」も曖昧でよくわからんな。
T* const のことか、 T const* のことか?
ん。あんた>604か?
0609デフォルトの名無しさん
NGNGT& constとT&だろ。607にはちゃんと通じてるぞ。
T* cosntだろ。
T const*をconstポインタなんて呼ぶ文化があるのか?
604じゃないぞ。
0610デフォルトの名無しさん
NGNGT* const なら、 const_cast したところで非constになるわけじゃないだろ。
コンパイラは騙せるが、書き込めば未定義動作だ。
> T const*をconstポインタなんて呼ぶ文化があるのか?
そんな文化は無いが、「constポインタ」でどちらかわかるのはエスパーだけ。
ちなみに、
http://www.google.co.jp/search?hl=ja&ie=UTF-8&q=%22const%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%22
> 遅延初期化やserializationとかで困る。
C++ならおとなしく普通のポインタにしとけってことだろ。
0611デフォルトの名無しさん
NGNGC++に他言語のまともな参照を要求する奴はアホ
0612デフォルトの名無しさん
NGNGっていうのは、オブジェクトの属性にすべきなんだろうか。
どっちかって言うと、クラスの属性(そのクラスの全インスタンスの属性)で
あるべきではなかろうか。
0613デフォルトの名無しさん
NGNGobj.SetX(5); // throw change_error_exception
0614デフォルトの名無しさん
NGNGそのオブジェクトを指している変数の属性、だと思う。
0615デフォルトの名無しさん
NGNGつまりそのオブジェクトを指している変数が変わる事で、
その、さされている側のオブジェクトがconstか非constかを
変えるべきである、って事?
複数の変数からオブジェクトが指されている時は、
どうなるのがイイと思う?
0616デフォルトの名無しさん
NGNGclass ReadOnlyClass;
class WritableClass : public ReadOnlyClass;
のようになっていて、書き換えられる場面とられない場面でインターフェイスを使い分けるんだけど、
それはめんどくさいし、さらにそのクラスを継承した場合などで面倒なことになる。
const 変数は
暗黙のうちに、すべての型に対して
class A : public const_A;
のようなインターフェイスを提供している。
しかも A を継承した型 B に対しても自動的に const_B を提供してくれる。
0617デフォルトの名無しさん
NGNG0618マイク ◆yrBrqfF1Ew
NGNG0619612
NGNGそだね。
0620デフォルトの名無しさん
NGNG正直なところ、C++の弱点らしい弱点なんて微々たるものですよ。
だって、習熟しちゃえば間違わないし。
いままで散々言われてきた諸問題だって、インテリのおっちゃんたちが
喧々囂々と随分頭ひねって落ち着けてきたわけで(の割には不甲斐ない実装も
ちらほら観られるようだが、それはさておき)、漏れ的にはあとはもう
boostが隠し持ってる「こんなの標準が持ってなきゃ嘘だろ!」なテンプレートとかを
とっととC++標準にしてもらいたい。
欲を言うとJavaみたくimplementsでインターフェイスだけさっくり継承とか、
いつまでもヘッダ山ほどincludeさせんなとっととパッケージ化してimport一発で済ませるように
してくれとか色々ありはするますが
…これってひょっとしてDでつか?
0621デフォルトの名無しさん
NGNG0622デフォルトの名無しさん
NGNG0623デフォルトの名無しさん
NGNGラッ
0624デフォルトの名無しさん
NGNG0625デフォルトの名無しさん
05/01/18 18:32:230626デフォルトの名無しさん
05/01/23 23:18:500627デフォルトの名無しさん
05/01/26 20:17:07INでもOUTでもあるパラメータってのが存在するから、
「ばか」とも断定しづらいと思われ。
いや、まあ、constは使ってもらいたいが
0628デフォルトの名無しさん
05/01/27 14:23:27古いCのライブラリに渡すので
中では結局const_castの嵐w
0629デフォルトの名無しさん
05/01/27 15:40:16const_castのカプセル化ということでそれはそれでいいじゃないか。
0630デフォルトの名無しさん
05/03/08 20:08:130631デフォルトの名無しさん
05/03/10 23:24:16復権っつーか、今やデフォでは?
0632デフォルトの名無しさん
05/03/11 06:44:06じゃあ書換可能な変数は
writable int x;
とかやんなきゃいけないの?
0633631
05/03/11 07:08:44「変更しない変数にはconstつけるのが常識」って言う意味な。
(曖昧でスマソ)
あと、書き換え可能な変数につけるのは「mutable」。
0634デフォルトの名無しさん
05/03/11 12:00:53誤解を招く発言はやめろ(w
0635デフォルトの名無しさん
05/03/11 12:41:510636デフォルトの名無しさん
05/03/11 15:45:010637デフォルトの名無しさん
05/03/11 22:14:330638デフォルトの名無しさん
05/03/12 13:27:390639デフォルトの名無しさん
05/03/12 13:57:250640デフォルトの名無しさん
05/03/12 14:23:57Runy持ち上げてる奴なんてこんなレベルだろうな。
0641デフォルトの名無しさん
05/03/12 14:38:030642デフォルトの名無しさん
05/03/12 15:15:210643デフォルトの名無しさん
05/03/12 15:29:58まぁ素直に考えて、言語の存在価値を提示してやり返すことができず、
その代替として人格批判に走ってしまう知能レベル及び人格レベルのことでは。
0644デフォルトの名無しさん
05/03/12 15:42:22メジャーリーグ-草野球
0645デフォルトの名無しさん
05/03/12 15:58:210646Rubyist!
05/03/12 16:00:02お前と同じようにスルーされた奴が一人も居ないとでも思ってるのか?
何十何百何千という人間がこの世の至る所でスルー食らってる。
そしてその大半が、それは己の実力の無さと自覚もしている。
してねえのはテメエだけだよ、ガキが。
「よく頑張りましたね」で褒めてもらえるのは義務教育の学校の中だけだ。
大体何がチラシの裏だ。あんたが結局言いたいのは
「俺が先なんだ先にやったんだ俺を忘れるな俺を見てくれ見てくれ見てくれ」
たったこれだけだろうが。
そうやって他人を踏みつけにするようなことをして、あまつさえそいつをチラシの裏だ愚痴だと誤魔化して。
最低だね、反吐が出るよ。
チラシの裏だというなら、本物のチラシの裏にでも書いとけ。
人に見せんな。
0647デフォルトの名無しさん
05/03/12 16:00:530648デフォルトの名無しさん
05/03/12 16:02:01>人格批判に走ってしまう知能レベル及び人格レベルのことでは。
目くそ鼻くそを笑うだな。
0649デフォルトの名無しさん
05/03/12 16:03:150650デフォルトの名無しさん
05/03/12 17:01:450651デフォルトの名無しさん
05/03/12 17:28:41>自己顕示欲が旺盛で羨ましい限りですね。
とコテハンが申しております。
0652デフォルトの名無しさん
05/03/15 18:33:130653デフォルトの名無しさん
05/03/15 18:36:59いつもなぜかconst intと書くな。
0654デフォルトの名無しさん
05/03/15 18:48:250655デフォルトの名無しさん
05/03/15 18:51:17こないだ、char const * const って書いたらキモイって言われた……_| ̄|○
そいつに言わせると、普通は、const char * らしい。
それじゃあ string が差してるポインタは変更できるじゃんなぁ?(´Д`)
static const char *string = "abc";
string = ""; // (´人`)チーン
static char const * const string = "abc";
string = ""; // (´ー`)ニンマリ
0656デフォルトの名無しさん
05/03/15 18:53:37それって規格上okだっけ?
char **const argv
なら良いと思うけど。
0657#
05/03/15 18:57:260658#
05/03/15 18:58:0006591#
05/03/15 19:01:050660デフォルトの名無しさん
05/03/15 19:31:42ISO/IEC 9899:1999(C99)ではargvは書き換え可能な文字列で「なければならない」。
ISO/IEC 14882:1998(C++)は見つからない…誰か知らないか?
0661デフォルトの名無しさん
05/03/15 19:36:38それは使い分ける意味があるだろ。
意味が一緒のconst char * と char const * のどっちで記述するかって事じゃないのか。
0662デフォルトの名無しさん
05/03/15 19:37:02>>655
理解できてない気がする
static const char * const string = "abc";
string = ""; // (´ー`)ニンマリ
static char const * const string = "abc";
string = ""; // (´ー`)ニンマリ
0663655
05/03/15 19:55:06ポインタも const にするべき局面だったんだけど、そうしない馬鹿がいたよ、という話なのね。
理解できてないとか言う前に、笑いどころを理解してほしい(´Д`)
0664デフォルトの名無しさん
05/03/15 19:58:200665デフォルトの名無しさん
05/03/15 20:20:540666デフォルトの名無しさん
05/03/15 20:22:52何か問題でも?
0667デフォルトの名無しさん
05/03/15 20:34:430669デフォルトの名無しさん
05/03/15 21:38:590670デフォルトの名無しさん
05/03/16 08:34:10iterator_constと書きたくてしょうがなかったりするんかね
ああ、キモ
0671デフォルトの名無しさん
05/03/16 14:06:550672デフォルトの名無しさん
05/03/16 15:08:56唐突に誰も話題にしていないことを話して「阿呆?w」とか書かれても、
意味不明すぎてお前が阿呆に見えるばかりだよ。
0673デフォルトの名無しさん
05/03/16 15:14:120674デフォルトの名無しさん
05/03/16 15:31:35誤読して「w」とか付けちゃってる奴のアホさとは比べものにならん。
0675デフォルトの名無しさん
05/03/16 15:35:51イイヨーイイヨー(・∀・)
0676デフォルトの名無しさん
05/03/16 15:43:230677デフォルトの名無しさん
05/03/16 22:52:31流されてint const&♪
0678デフォルトの名無しさん
2005/03/24(木) 22:56:250679デフォルトの名無しさん
2005/04/07(木) 20:28:590680デフォルトの名無しさん
2005/04/07(木) 21:12:150681デフォルトの名無しさん
2005/04/07(木) 21:20:220682デフォルトの名無しさん
2005/04/07(木) 21:27:200683デフォルトの名無しさん
2005/04/07(木) 21:56:270684デフォルトの名無しさん
2005/04/09(土) 10:45:420685デフォルトの名無しさん
2005/04/09(土) 11:08:080686デフォルトの名無しさん
2005/04/09(土) 23:43:54static と auto は共存できないんだったな orz
0687デフォルトの名無しさん
2005/04/11(月) 14:15:22register auto const volatile unsigned long long int racvulli = 0;
0688デフォルトの名無しさん
2005/04/11(月) 15:47:20public:
ore():doutei(true) {};
private:
const bool doutei;
};
0689デフォルトの名無しさん
2005/04/11(月) 19:42:30ひとつしか現れてはいけない。
0690デフォルトの名無しさん
2005/04/12(火) 05:19:440691デフォルトの名無しさん
2005/04/12(火) 07:49:240692デフォルトの名無しさん
2005/04/12(火) 22:02:50#define global extern
ちなみにグローバル変数の定義時にもexternは付けられる。
0693デフォルトの名無しさん
2005/04/13(水) 00:58:17どこかに一つ、extern無しの実体が無いと駄目だろ。
と思ったが、VC6でこれが通った。
extern int a = 0;
初期化が伴えばそれが定義と決定されると規定されているのか?
0694デフォルトの名無しさん
2005/04/13(水) 13:42:13C か C++ で過程が違う。結果は同じだけど。
初期化子があればいずれも最終的に定義になる
0695デフォルトの名無しさん
2005/04/14(木) 00:46:170696デフォルトの名無しさん
2005/04/14(木) 01:10:470697デフォルトの名無しさん
2005/04/14(木) 12:00:340698デフォルトの名無しさん
2005/04/15(金) 00:52:08「OKです」って、コレ、いいのか?
0699デフォルトの名無しさん
2005/04/15(金) 01:26:28ウイルス対策で書き込み禁止になったら使えなくなるテクだな
0700デフォルトの名無しさん
2005/04/15(金) 08:43:21エエエェェェ(´Д`)ェェェエエエ
0701デフォルトの名無しさん
2005/04/15(金) 11:45:410702デフォルトの名無しさん
2005/04/25(月) 23:16:450703デフォルトの名無しさん
2005/04/25(月) 23:36:440704デフォルトの名無しさん
2005/04/26(火) 00:35:270705デフォルトの名無しさん
2005/04/26(火) 06:16:040706デフォルトの名無しさん
2005/04/26(火) 10:43:27それじゃアンチっぽい
0707デフォルトの名無しさん
2005/04/29(金) 11:41:070708デフォルトの名無しさん
2005/04/29(金) 14:36:410709デフォルトの名無しさん
2005/07/19(火) 00:35:520710デフォルトの名無しさん
2005/07/19(火) 01:42:130711デフォルトの名無しさん
2005/07/20(水) 22:55:25つうか、こんなに放置しても落ちないのか。
0712709
2005/07/20(水) 23:40:47漏れもびっくりした。底の方には4/20日前後が最終書き込みのスレはいくつかあるけど。
まあ、漏れが常駐しているライトノベル板には最終書き込みが去年のスレとか
まだ残ってたりするわけですが……。
0713デフォルトの名無しさん
2005/07/25(月) 11:43:240714デフォルトの名無しさん
2005/09/02(金) 21:18:202chギネスに載ってた最長レス間隔もシミュレーション板だっけ?
0715デフォルトの名無しさん
2005/09/29(木) 14:17:59public:
const_reference operator [](size_type n) const
{
return p[n];
}
reference operator [](size_type n)
{
return const_cast<reference>(static_cast<const hoge&>(*this)[n]);
}
■ このスレッドは過去ログ倉庫に格納されています