アプリ版:「スタンプのみでお礼する」機能のリリースについて

C++配列の型に関するC++規格について教えていただきたいです。

以前にYahoo知恵袋でも質問しましたが、答えが得られませんでしたので、こちらでも質問させていただきたいと思います。


※以下、質問になります。(分かり難いかも知れませんが宜しくお願い致します。)


環境は、Visual Studio 2010 (C++) です。

std::fill_n() で次のような警告がでましたので、調べていましたところ、
...\xutility(2801): warning C4996: 'std::_Fill_n': Function call with parameters that may be unsafe - ...

次のような定義方法を見つけました、
typedef char (&std::tr1::_No)[1];
↑このような定義方法があることを初めて知りました。

ちなみに、std::fill_n() は次のようになりました。
long data[32];
std::fill_n(data, 32, 0); ←正常

long* p_data = data;
std::fill_n(p_data, 32, 0); ←warning

long (&a_data)[32] = data;
std::fill_n(a_data, 32, 0); ←正常


知りたいのは、配列を関数に渡すときに、
通常は、void func(long* pd); のようにポインタで渡すと思います。
また、void func(long pd[]); や void func(long pd[32]);
もポインタの場合と同じになりますが、型保証がありません。
これはC++規格で規定されていることだと思います。

次のようにすると、型保証がされますが、この記法がC++の規格として規定されているかを知りたいです。
1. void func(long (&ad)[32]); // 関数呼び出しは、func(data);
2. void func(long (*pd)[32]); // 関数呼び出しは、func(&data);

また、通常のポインタで配列を渡すことを、配列の参照渡し?と言うと思いますが、
この1,2,は何渡し?と言われるのでしょうか?


#長い文になって申し訳ありませんが、宜しくお願い致します。

A 回答 (2件)

ばっさりいってしまうと, 1, 2 ともちゃんとある.


というか, 2 については C++ 以前に C にもあるんだが.
以下余談:
long data[32];
と定義されているとしましょう. このとき, 次の式
*(data + 3) = 7;
における「data の型」は何だと思いますか?
    • good
    • 0
この回答へのお礼

回答して頂き、ありがとう御座います。

> *(data + 3) = 7
data+3 ← longポインタ型だと思っていました。違うんでしょうか?
*(data+3) ←long型??

Cにも規定されていたんですね。
「ANSI C/C++ 辞典 (平林雅英著) (1997/3版)」には記述が見つけられませんでしたので、
てっきりCにはないものと思い込んでいました。

お礼日時:2010/08/29 10:29

> 次のようにすると、型保証がされますが、この記法がC++の規格として規定されているかを知りたいです。


> 1. void func(long (&ad)[32]); // 関数呼び出しは、func(data);
> 2. void func(long (*pd)[32]); // 関数呼び出しは、func(&data);

規定されています。

> また、通常のポインタで配列を渡すことを、配列の参照渡し?と言うと思いますが、

それは便宜的な表現です。
言語仕様上はあくまでも値渡しです。

> この1,2,は何渡し?と言われるのでしょうか?

1.は参照渡しですが、2.は(ポインタの)値渡しです。
    • good
    • 0
この回答へのお礼

明確な答えをしていただきましてありがとう御座います。
やっとスッキリしました。

お礼日時:2010/08/29 10:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!