g ++とMSVCのC ++引用の意味

おそらく、この質問に答えるGoogleの検索がありますが、私の人生では何百万という無関係な答えを得られないものは考えられません。

そう、

In MSVC text inside quotes "like this" is taken, I think, as a std::string or, maybe, std::string&. In g++/gcc it always seems to be taken as const char*. True?

私が試してみたいコードスニペットが見つかりました。

if(NULL == key)
   throw exception("Empty key");

MSVC/VC ++でうまくコンパイルする(2008年(ただし、g ++(4.4.3)で試してみると

no matching functions for calls to std::exception::exception(const char&) 

私はこれを働かせる:

if (NULL == key)
{
   std::string   estr   ("Empty key");
   throw exception("Empty key");
}

しかし、それはちょうど醜いです。

これは私に別のエラーをもたらした:

std::string   estr   ("");
if (NULL == key)
{
   estr = "Empty key";
   throw exception("Empty key");
}

I have no clue what exception() expects as its input. I did find something that suggested std::string or maybe std::string& but I lost that page and the millions of unhelpful pages I've found since are, well, useless. Have all kinds of info on exception class, exception use,....

Short of my ugly fix, is there a simple way to tell g++ that "this is a std::string" not a const char& and still keep VC++ happy? (obviously I'm trying to do cross compilable code from single source.)

そしてそのことについては、どのようにID

   throw exception("Empty key");

と違う

   throw "Empty key";

ありがとう、

ウェス

0
例外をスローする(新しいstd :: string( "Empty key"));
追加された 著者 Dirk Dastardly,
@MikeSeymour:OK、多分私は誤解しています。コンパイラは例外がstd :: stringを期待していることを彼に伝えていませんか?もしそうなら、例外をスローしてstd :: stringを渡すと、コントロールは決して例外を越えて返されることはないので、破壊されるでしょうか?
追加された 著者 Dirk Dastardly,
@DrewBurchett: exception にはデフォルト以外のコンストラクタはありません。そのため、メモリリークの作成が良いアイデアだったとしても機能しません。
追加された 著者 Mike Seymour,
@DrewBurchett:エラーは、一致するコンストラクタがないと言っていて、何が期待されているかを示していません。 runtime_error のような exception の標準サブクラスは、初期化されている文字列のコピーを格納します。
追加された 著者 Mike Seymour,

4 答え

文字列リテラルは常に、文字列にヌル終端文字を含む文字を入れるのに十分な大きさの char の配列型を持ちます。したがって、 "空のキー" のタイプは char [10] です。これは、必要に応じて char const * または std :: string に暗黙的に変換できます。

The error is because exception is intended as a base class for exception types, not something you instantiate directly. You should throw one of the types defined in such as std::runtime_error (which can be constructed using a string), or define your own type that inherits std::exception and overrides what().

私はMicrosoftが非標準のコンストラクタを std :: exception に追加したと推測しています。彼らは奇妙な方法で言語を拡張するのが好きです。

3
追加された
素晴らしい答え!どうもありがとう。
追加された 著者 Wes Miller,
@MSalters:もちろん、それは合法です。私が望むなら誰かがそれを公にする合理的な正当性を思い付くことができると確信しています。移植性の観点からは(この質問が示すように)悪い考えです。
追加された 著者 Mike Seymour,
@Gorpik:OPで使用されていた古いバージョンのようです(投稿されたコードが本当にコンパイルされ、 exception という別の型が std :: exception >);より最近のバージョン、少なくとも4.4.5以降、しないでください。
追加された 著者 Mike Seymour,
Microsoftが非標準のコンストラクタを追加することは完全に合法です。特に、標準ライブラリの他の例外の基本型として使用することを意図しているためです。これらは標準ライブラリの実装の一部であるため、これらの例外は基本クラスの実装固有のメソッドを使用する場合があります。実装固有の基本クラスを使用するのも一般的です。
追加された 著者 MSalters,
g ++には、 std :: exception のための非標準コンストラクタもあります。それ以外の場合は、質問の2番目の例はコンパイルされません。
追加された 著者 Gorpik,
@MikeSeymour:私は彼のことを信頼しない理由がなかったので、私はOPの質問に基づいていました。彼の2番目の例が間違っているかg ++が非常に珍しいことをしています。つまり、マイナーリリースの機能を削除すると、既存のコードが破損する可能性があります。
追加された 著者 Gorpik,

std :: string 型で例外をスローするのは避けてください。そのような場合は、未定義の動作が発生します。

Throw standard exceptions defined in or have your own exception class derive from std::exception class and throw it.And override the what() method to add appropriate description of the exception.

また、常に throw を値で、 catch を参照してください。

2
追加された

std :: exceptionは基本クラスです。

代わりにstd :: runtime_errorを投げてみてください。

2
追加された

"like this" is always regarded as an array of const char, according to the standard. This is not the problem here. What really happens is that std::exception only has the default constructor, once again according to the standard. It is usual to include an additional constructors taking a text string, but this constructor works differently in VC++ and g++, as your example shows.

私はここにg ++の文書を持っていませんが、あなたの例から、非標準のコンストラクタを次のように定義しているように見えます:

explicit exception(const std::string&);

VC ++は非標準コンストラクタを次のように定義しています。

明示的例外(const char *);

0
追加された
文字列リテラルは、ポインタではなく配列です。
追加された 著者 Mike Seymour,
@MikeSeymour:あなたは正しいです、修正されました。
追加された 著者 Gorpik,