質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

10466閲覧

なぜstd::stringにはconst char*への暗黙の変換が定義されていないのでしょう?

yuba

総合スコア5568

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2015/08/28 02:44

C++標準ライブラリのstd::string, std::wstringからconst char*, const wchar_t* を取ろうとしたら c_str() を明示的に呼ばないといけません。
それはもちろん operator const char*() が定義されていないからなのですが、C++11,C++14といつまで経っても追加されないのが不思議に思います。

ユーザーコード内に頻繁に.c_str()を書かないといけないのはビジネスロジックより低レベルでノイズなため、排除できたらいいと思いません?

MFCのCStringやAndroidのString8はこの暗黙の変換を持っていることですし一見問題なさそうに思うのですが、あると何かまずいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

未解決、ということは、引用されている記事の内容に納得されていない、ということでしょうか?
stackoverflowの内容を要約すると、
(1) 暗黙にキャストが行われることで検出が困難なバグが発生することがある。
(Karel Petranek氏、CashCow氏が同意見、Matthieu M.氏が例示)
(2) 内部構造にヌル終端文字列が使われているとは限らず、暗黙な変換によるコストが高いことがある。
(edA-qa mort-ora-y氏)

実は以前、私も同じ疑問を覚え、師に聞いたのですが、そのときの説明は(1)でした。

std::string text = "C++";
printf("%s", text);

このコードはどのように動作するか、という例だったと思います。
(結論からいうと、予測不可能で、最悪、コンピュータが壊れます。)
可変長引数をとるので、第2引数以降にどのような型を指定しても、暗黙の型変換は起きません。

「printfに渡すときだけ、c_str()を呼び出せばいい。」ある意味では正しいです。
ですが、同じNative-Cなライブラリを使うときであっても、
ある時は書かなくてもいいが、別のときは書かないといけない、
というのは、間違いを起こしやすい仕様です。
そのため、規格立案者は8文字の省略よりも、すべての場合で明示的な変換を必要とする
設計を採用したのだと思います。

投稿2015/09/07 11:56

majiponi

総合スコア1720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2015/09/07 14:53

printfうんぬんというのは確かに読んだ気がしたのですが、なんか皮肉っぽい書き方してるなーくらいで読み飛ばしていました。 なるほど確かにprintfの可変長引数部分では勝手にキャストしてくれるわけありませんでしたね。
guest

0

stackoverflowい同じ話題がありましたが、個人的には「内部構造が違うと自動変換が高コストになる」というところに納得できました。

MFCやAndroidだと内部構造も決まっていて、コスト高になる心配がないから採用できているのでしょう。

投稿2015/08/28 03:03

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2015/08/28 03:07

なるほど… しかしC++11で内部構造も規定(連続した配列として確保すること)されたので、採用のしどきだったのでは? という風にもなってきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問