3

次のコードがコンパイルされ、コンパイルされないのはなぜC++11ですかC++03gccとの両方cl

#include <string>
#include <iostream>
#include <fstream>

int main(int argc, char* argv[]) {
    const std::string t("Hello");
    std::ofstream out(t);
}

ストリームがコンストラクターパラメーターとしてC++03受け入れられないのはなぜですか?この決定は何かに基づいたものですか、それとも偶然に起こったのですか?std::string

4

3 に答える 3

9

std::stringを受け取るコンストラクターが C++11 でのみ追加されたため、厳密に準拠した C++03 コンパイラーでコンパイルすると、コードは失敗します。

「何かスマートなものをベースにしていたのか」という質問については、インターフェース追加されたので、それを省略した技術的な理由はなかったと推測できます。

を持っている場合は、std::stringいつでも を呼び出し.c_str()て、古いインターフェイスでの使用に適した C 文字列を取得できるため、便利です。(C++11 のドキュメントにあるように、 を受け取るコンストラクターは、文字列を呼び出した結果を受け取る対応するコンストラクターを呼び出すのstd::stringまったく同じ効果があります。)const char*.c_str()

于 2012-02-27T22:22:59.620 に答える
5

私が思い出したように、これは数年前に clc++.m で議論され、Andrew Koenig (とにかく Andrew だったと思います) は、実際にはいくつかの会議で持ち出されたと言いましたが a を受け入れるという考えstringはすぐにも受け入れ、wstringそこからファイル名での国際化された文字セットのサポートについての議論に変わりました...その後すぐに、誰も適切に対処する準備ができていないワームの大きな缶を開いたため、アイデア全体が破棄されましたそれから。

于 2012-02-28T00:59:48.610 に答える
2

string彼らは、C++03 でコンストラクターを追加することを単に忘れていました。これで修正されました。今回は、 などの他のことが忘れられていましたmake_unique。できることは常にあります。C++03 では、現在含まれている関数テンプレートの既定の引数を指定することも忘れていました。

編集: @Charlesが言うように、それは文字通りの「忘れ」ではないかもしれませんが、明らかにそこにあるはずのものですが、何らかの理由で指定されていませんでした。さらなる例はstd::next/std::prevで与えられます。これは非常に安心です。そしてstd::to_stringstd::stoi/d/ul/ullこれも完全に理にかなっていますが、今回まで誰もそれらを指定することはできませんでした。前回の欠席には必ずしも深い理由があるわけではありません。

于 2012-02-27T22:27:03.800 に答える