トップページ⇒tech
1001コメント269KB

C++相談室 part103

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/06/15(土) 23:14:35.92
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part102
http://toro.2ch.net/test/read.cgi/tech/1368314383/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.84【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1367137639/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/
0153デフォルトの名無しさん2013/06/24(月) 13:16:40.36
>>152
ご指摘通り、配列を実体化してませんでした。。。忘れてました。
どうもありがとうございます!!
0154デフォルトの名無しさん2013/06/24(月) 13:40:54.89
tdmつかってます。cstdintをincludeしてもint64_tが使えないのはなぜですか?
つかえるようにしかた教えてください。
0155デフォルトの名無しさん2013/06/24(月) 14:41:26.54
>>154
tdmつかってないけど、std::int64_tなオチじゃね?
0156デフォルトの名無しさん2013/06/24(月) 14:59:41.36
じゃない。
0157デフォルトの名無しさん2013/06/24(月) 15:06:14.54
#include <stdint.h>
ならstd::付けなくても大丈夫じゃね?
0158デフォルトの名無しさん2013/06/24(月) 15:08:08.99
cstdintのヘッダーみてるとマクロで使えないようにしてあるみたいっす。
0159デフォルトの名無しさん2013/06/24(月) 15:10:29.91
-std=c++0xオプションが要るとか
手持ちのg++ 4.4.3だとこのオプション付けないとワーニング表示するよ
0160デフォルトの名無しさん2013/06/24(月) 15:13:00.16
オプションはつけてマッスルよ。
0161デフォルトの名無しさん2013/06/24(月) 15:28:43.64
int64_tが無いKUSOコンパイラなんだよきっと
別に規格違反ではない
0162デフォルトの名無しさん2013/06/24(月) 15:33:26.72
>>161
あんさんの使っているコンパイラーは何にょ?
0163デフォルトの名無しさん2013/06/24(月) 15:35:52.74
c++0xオプションつけてるのにstd::int64_tが
マクロで抑制されているとなると、
Windowsで32ビットバイナリの時は使えないとか?
0164デフォルトの名無しさん2013/06/24(月) 15:38:50.39
えっと、-m64でしたっけ・・・
つけてマンスリーよ
0165デフォルトの名無しさん2013/06/24(月) 15:45:58.64
>>164
お前、どうせ後で
「みなさんがいつ正解に辿り着くか試していました。バカばっかですね」
とか言うつもりだろ?
0166デフォルトの名無しさん2013/06/24(月) 15:47:21.58
馬鹿ばっかですね。
0167デフォルトの名無しさん2013/06/24(月) 15:50:43.52
>>165
それをいうのは俺の仕事だ 邪魔すんな
0168デフォルトの名無しさん2013/06/24(月) 18:40:26.30
>>154
馬鹿には使えないんです。諦めて下さい。
0169デフォルトの名無しさん2013/06/26(水) 05:05:43.88
最近C++の変数は初期化されるって言う人よく見るんだけど仕様何か変わったりしたの?
プリミティブ型は明示的にコンストラクタ呼ばないと初期化されないと思ってるんだけど
あとSTLで明示的にコンストラクタを呼ぶ呼ばないって規約あるの?
0170デフォルトの名無しさん2013/06/26(水) 05:22:29.12
どこでそんなアホな人間を見かけるんだ?
お前は毎日家畜小屋でもうろついているのか?
0171デフォルトの名無しさん2013/06/26(水) 07:09:00.19
STLってなんですか?
0172デフォルトの名無しさん2013/06/26(水) 07:12:23.33
スゲー
テクニカルな
ロコモーション
01731542013/06/26(水) 10:05:42.59
stdint.hをincludeしたらint64_tが使えました。
cstdintではstd::をつけても使えません。
cstdintではなぜつかえないのですか?
教えてください。
0174デフォルトの名無しさん2013/06/26(水) 15:11:46.23
>>169
VC++のデバッグバージョンの話じゃないか?
0175デフォルトの名無しさん2013/06/26(水) 15:45:31.88
>>173
>>168
0176デフォルトの名無しさん2013/06/26(水) 21:39:15.78
>>169
int k;不定
int k();関数宣言
int k{};ゼロ
int k = {};ゼロ
0177デフォルトの名無しさん2013/06/26(水) 21:42:53.70
×初期化される
○初期化できる
0178デフォルトの名無しさん2013/06/26(水) 21:55:50.15
>>169
そういう奴はマルチユーザーOSではユーザーモードへからカーネルモードへのメモリ確保要求は0埋めして返すという暗黙のルールを知らずに勘違いした観測結果を見てる
0179デフォルトの名無しさん2013/06/26(水) 21:58:29.86
>>178
あ、カーネルの暗黙のルールとかどうでもいいです
ここはOSスレじゃなくて言語スレなんで
0180デフォルトの名無しさん2013/06/26(水) 22:04:28.53
>>179
「言語仕様的に考えて自動初期化なわけねーだろ馬鹿」
ってことだろ察しろよ
0181デフォルトの名無しさん2013/06/26(水) 22:08:02.81
>>179
言語理解能力のないバカ
0182デフォルトの名無しさん2013/06/26(水) 22:14:01.40
>>178=>>180=>>181
OSカーネルとかとんちんかんな
関係無い話を持ち出すなってことだよ
理解できないなんて残念な奴だなー
0183デフォルトの名無しさん2013/06/26(水) 22:31:31.54
言語仕様的に考えて自動初期化なわけねーだろ馬鹿
0184デフォルトの名無しさん2013/06/26(水) 22:47:56.74
じゃなんでvectorはゼロ初期化なん?
0185デフォルトの名無しさん2013/06/26(水) 22:52:37.46
コンストラクタがよばれるからだろアホ
0186デフォルトの名無しさん2013/06/26(水) 22:54:13.02
C++03はresize関数が初期値を必ず要求するから
デフォルト引数でゼロ初期化される

C++11はゼロ初期化されない
0187デフォルトの名無しさん2013/06/26(水) 22:56:28.17
>>186 んなこたーない。
0188デフォルトの名無しさん2013/06/26(水) 22:58:04.84
初期化のされ方が違うんじゃなかったっけ

03・・・デフォルトコンストラクタを増えた個数回呼び出す
11・・・デフォルトコンストラクタを1回呼び出し、それをコピーコンストラクタで広げる

ような感じだったような
0189デフォルトの名無しさん2013/06/26(水) 22:58:51.94
相変わらずきもい言語だな
0190デフォルトの名無しさん2013/06/26(水) 23:00:04.17
>>185,>>188
言語理解能力のない馬鹿
0191デフォルトの名無しさん2013/06/26(水) 23:01:02.76
>>190
規格票持ってんのか?ああ?
0192デフォルトの名無しさん2013/06/26(水) 23:06:13.41
>>188
違う
初期値指定付きのresizeは03も11も変わらない

03には本当の意味での初期値指定なしのresizeは存在せず、
一見初期値指定なしに見えるものはデフォルト引数が使われているだけ

11には本当に初期値指定指定なしのresizeが存在する
この場合は増えた要素をアロケータで初期化するのだけども
POD型では初期化されないようになっている
(もちろん初期化するようなアロケータを指定すれば初期化されるようにもできるが)
0193デフォルトの名無しさん2013/06/26(水) 23:21:11.04
>>192
いや、PODでも値初期化されるだろ。
0194デフォルトの名無しさん2013/06/26(水) 23:23:19.93
>>192
いくらなんでもそんな危険な変更が入るわけが無い。
0195デフォルトの名無しさん2013/06/26(水) 23:24:42.07
だよね
初期値指定なしのシグニチャのがPODをゼロ初期化しなかったら互換性ぶちこわしだもんね
0196デフォルトの名無しさん2013/06/26(水) 23:29:52.04
要するに、旧仕様だとuninitialized_fillを使わなきゃいけなかったのが
PODの場合memsetが使えるようになったというだけだろ
0197デフォルトの名無しさん2013/06/26(水) 23:33:37.65
コンストラクトごとに値が変わりコピーでは値が変化しないようなクラスでは互換性のない破壊的変更だったけどね
0198デフォルトの名無しさん2013/06/26(水) 23:36:11.32
本当だ、ゼロ初期化されたわ
あれ、昔試した時はそうならなかったような……
気のせいか
0199デフォルトの名無しさん2013/06/26(水) 23:38:39.45
クラスのインスタンスを作る時はスタックに置かず、常にnew/deleteしてるコードを見たんですが、
なんか理由があるんでしょうか。
0200デフォルトの名無しさん2013/06/26(水) 23:40:01.51
Java教かなにかに入ってるんじゃないですかね
0201デフォルトの名無しさん2013/06/26(水) 23:41:16.77
例外とか気にしないのかなと思う
0202デフォルトの名無しさん2013/06/26(水) 23:41:37.39
スマポで解決
0203デフォルトの名無しさん2013/06/26(水) 23:56:28.59
>>196
C++03でも値初期化されたPODによるuninitialized_fill()をmemset()に最適化することは可能だよ。
0204デフォルトの名無しさん2013/06/27(木) 00:00:22.80
教えてください。
std:string str;
strに8byte毎に16進数での追加の方法がわかりません
たとえば、char str2[50];
str2 = 0x61 のように入れたいです。
str.append('0x61'); のようにすると、コンパイルエラーが発生します。

おねがいします。
0205デフォルトの名無しさん2013/06/27(木) 00:09:14.97
>>204
> str2 = 0x61 のように入れたいです。

std::string 以前に、そんなことできないから。
やりたいことが何なのかさっぱり。
0206デフォルトの名無しさん2013/06/27(木) 00:09:16.92
.append('\x61')
0207デフォルトの名無しさん2013/06/27(木) 00:52:31.09
>>204の超訳:
「charをstringに変換したいです><」
0208デフォルトの名無しさん2013/06/27(木) 01:05:23.44
>>206
コンパイルエラーでできませんでした。
レスありがとうございました。

str.append(1,'\0');
str.append(1,0x61);

でコンパイル通りました。
お騒がせしました。
0209デフォルトの名無しさん2013/06/27(木) 01:09:12.68
push_backのほうがいい気がするけど
まあどうでもいいや
0210デフォルトの名無しさん2013/06/27(木) 01:14:50.84
>>204 の「8byte毎に」は何だったんだ・・・?
0211デフォルトの名無しさん2013/06/27(木) 01:18:02.15
8bit毎にの間違いでしょ
0212デフォルトの名無しさん2013/06/27(木) 01:37:17.07
ああなるほど
0213デフォルトの名無しさん2013/06/27(木) 03:27:27.34
169だけどこの話題出すといつも170-198みたいな流れになって誤解が多いのが分かる
未初期化のゼロを勘違いしやすいんだと思うけど
記憶が正しければ言語仕様は>>176でよくて、ライブラリに規約があるのかどうかが分からない

>>192
それって処理系の実装の話?仕様の話?

他にはpairのctorで初期化してるかどうかでmapの使い方変わるし
誰かおせーて
0214デフォルトの名無しさん2013/06/27(木) 08:11:25.42
>>213
コンテナ要素は Allocator テンプレート引数に応じて allocator_traits<Allocator>::construct
で構築される。 23.2.1 [container.requirements.general] p3

allocator_traits<allocator_type>::construct は可能 (well-formed) であれば
Allocator::construct を使う。 20.6.8.2 [allocator.traits.members] p5

デフォルトの std::allocator<T> について construct<U, ...>(U* p, ...) は
::new((void *)p) U(...) と規定されている。 20.6.9.1 [allocator.members] p12

引数なしなら ::new((void *)p) U() となり、 POD でも値初期化=ゼロ初期化される。
5.3.4 [expr.new] p15, 8.5 [dcl.init] p10,p7,p5
0215デフォルトの名無しさん2013/06/27(木) 12:13:06.33
<cstdint>をincludeしなくてもstd::int64_tがつかえるのはなぜですか?
0216デフォルトの名無しさん2013/06/27(木) 12:16:38.33
>>215
他のヘッダからインクルードされてるからだろう
そういうのは可搬性ないよ
0217デフォルトの名無しさん2013/06/27(木) 12:18:02.92
可搬性ないよの意味を教えてください。
0218デフォルトの名無しさん2013/06/27(木) 12:30:24.83
cstdintを必ずインクルードしないと動かない処理系があっても文句は言えないという意味
0219デフォルトの名無しさん2013/06/27(木) 12:34:43.10
くりくりー
ありがたまきん
0220デフォルトの名無しさん2013/06/27(木) 13:09:24.91
演算子のオーバーロードについて質問です。

class LongBit {
private:
//略
public:
//略
LongBit operator*(unsigned a);
//略
};

LongBit LongBit::operator*(unsigned a)
{
//略
}

こう書くとエラーになります(略の部分はちゃんと書いてます)。どうすればよろしいでしょうか?
0221デフォルトの名無しさん2013/06/27(木) 14:02:44.65
>>220
悪くないようだ他所で問題があるのでは?
http://codepad.org/GyGGpLck
0222デフォルトの名無しさん2013/06/27(木) 14:07:38.78
ごめん手抜きしてたね
http://codepad.org/iwKKyZFZ
0223デフォルトの名無しさん2013/06/27(木) 14:43:43.59
>>220
&がなくてconstがないので使い方に制限がある
0224デフォルトの名無しさん2013/06/27(木) 16:26:03.87
>>214
なるほど、デフォルトのアロケータがコンストラクタ呼ぶのか
pairの話に戻るけど、これ自身はコンテナではないからそのメンバはアロケータを経由しないわけだけどそれらの初期化についてはどう?
手元の処理系では概ね初期化してるようだけど
pair::pair() : first(), second() {}

というのもPODなら簡単だけどPODを持つ非PODが面倒で、そのコンストラクタで初期化してやらないとPODのゼロ初期化を呼べなくなるよね
struct A { A(){} int a; } a = A();
// uninitialized a.a
0225デフォルトの名無しさん2013/06/27(木) 19:11:05.30
何が言いたいかよくわからないが
pairのデフォルトコンストラクタはfirstおよびsecondを値初期化することになってる
0226デフォルトの名無しさん2013/06/27(木) 19:35:31.58
昔試した時は、初期化させないアロケータを自分で作った可能性がある
0227デフォルトの名無しさん2013/06/27(木) 21:17:45.10
>>220
本気で質問する気があるなら
エラーメッセージも書くか
エラーが再現する最低限のコードを
codepadかideoneに貼れksg
0228デフォルトの名無しさん2013/06/27(木) 22:19:46.44
しーぷらぷら
0229デフォルトの名無しさん2013/06/27(木) 22:21:37.17
マジキチぷらぷら丸
0230デフォルトの名無しさん2013/06/27(木) 22:42:57.76
>>224
少しは自分で規格読もうとしろよ。
0231デフォルトの名無しさん2013/06/28(金) 04:44:32.41
関数に付いてるconstがよくわからないんですが
0232デフォルトの名無しさん2013/06/28(金) 05:00:33.01
メンバ関数の方なら
その関数を呼んでもメンバ変数が変更されないことを表す
0233KUSO KOTE2013/06/28(金) 05:31:45.10
>>231
struct UNKO {
 bool fuck () const && {★}
 bool fuck2 () && {}
 int v;
} kuso;
星印に於いてthisがconst UNKO &&型となる。
考え方としてはconst UNKO && this = &kuso;
としてから呼び出している感じ。

なのでfuckの中ではthis->vは弄れないし、
fuckからfuck2の呼び出しは
UNKO && this(fuck2の) = this(fuckの);
としているようなものなので 呼び出せない。
static関数ではthisが無いのでconstは付けられない。
0234KUSO KOTE2013/06/28(金) 05:40:14.80
あ、&&が邪魔だった。読み飛ばして。
0235デフォルトの名無しさん2013/06/28(金) 05:54:24.63
つまりこういうこった
class X { void f() const && {} };
X x;
move(x).f();
→
 X 「const &&」 tmp = move(x);
 X const * const _this_ = &tmp;
0236デフォルトの名無しさん2013/06/28(金) 07:35:19.13
よく聞くPODって何なんだぜ?
0237デフォルトの名無しさん2013/06/28(金) 08:01:57.39
C時代の構造体
0238デフォルトの名無しさん2013/06/28(金) 08:27:01.89
そんだけなの?
構造体って言えばいいのに
0239デフォルトの名無しさん2013/06/28(金) 08:34:18.80
C  :構造体 = POD
C++:構造体 ⊇ POD
0240デフォルトの名無しさん2013/06/28(金) 08:38:46.32
ほぅ、ではC++の構造体というのが
規格の何ページ目で定義されるのか
伺おうか
0241デフォルトの名無しさん2013/06/28(金) 09:24:32.62
ページ数とかムズいな。
0242デフォルトの名無しさん2013/06/28(金) 11:37:19.95
いまどきページ数固定の本で調べてるってのがね。
0243デフォルトの名無しさん2013/06/28(金) 12:11:10.86
PDFでもページ番号打ってるな
JIS X3014:2003なら122ページ
ISO/IEC 14882:2011は中見てないけど218ページくらいかな
0244デフォルトの名無しさん2013/06/28(金) 12:34:16.40
PODは構造体のことじゃなくて(細かい規定は抜きにすると)C時代のデータ型のことで
intとかcharもPODだよ
0245デフォルトの名無しさん2013/06/28(金) 13:43:02.68
コピーできる値がPODで
そのままコピー出来ない参照(配列・ポインタ)と区別するための言葉
0246デフォルトの名無しさん2013/06/28(金) 17:02:25.24
構造体の中にポインタとか配列があったらPODじゃなくなるん?
初耳だな
0247デフォルトの名無しさん2013/06/28(金) 18:13:21.13
非PODのポインタや配列があったら非PODになりそうな気がする
規格は読んでない
0248デフォルトの名無しさん2013/06/28(金) 19:10:56.54
>>243
テキトーなこと言うなよ
書いてねーぞ
0249デフォルトの名無しさん2013/06/28(金) 20:02:25.94
9 [class] p8,10 でそれぞれ stadard-layout struct と POD struct が定義されている。
いずれも 〜 class から 〜 union を除いたものとされる。

ページ番号は 217 でいいのかな?
0250デフォルトの名無しさん2013/06/28(金) 22:04:04.06
>>249
で、構造体(structure)の定義はどこ?
0251デフォルトの名無しさん2013/06/28(金) 22:19:19.05
用語として structure の定義は無いよ。
0252デフォルトの名無しさん2013/06/28(金) 22:37:26.14
C++11で消えちゃったもんね
■ このスレッドは過去ログ倉庫に格納されています