あなたが与えるサンプルコード、
WriteLine(&String8("Exception"));
型がカスタム アドレス演算子を定義しない限り、標準 C++ としては無効です。String8
あなたが尋ねる、
「コンストラクターからテンポラリーのアドレスを取得することに不平を言うコンパイラーとそうでないコンパイラーがあるのはなぜですか?」
C++ 標準では、組み込みのアドレス演算子を使用して一時的なアドレスを取得することはできないと規定されているため、一部のコンパイラは文句を言います。
C++11 §5.3.1/3 :
「単項演算子の結果は、&
そのオペランドへのポインターです。オペランドは、左辺値または修飾 IDでなければなりません。
Visual C++ などの一部のコンパイラは、言語拡張機能としてアドレスを取得する機能を提供するため、文句を言いません。
ユーザー定義型は、カスタム アドレス演算子を定義できることに注意してください。したがって、あなたの場合はString8
typeによって異なります。コンパイラと同様に。
あなたはさらに尋ねます、
「それを 1 行で機能させる方法はありますか?」
はい、アドレス演算子を定義できます。しかし、それは良い考えではありません。まず第一に、標準ライブラリなどで問題が発生するだけであり、第二に、その必要性は非常にまれです。
そのような解決策を真剣に検討した 1 つのケース、つまり、COM スマート ポインターを外部引数として渡すケースだけを思い出すことができます。アドレス演算子を定義する代わりに、名前付きメソッドを定義しました。それははるかに明確で、他のものを妨げません。