Observation: the codes pasted below were tested only with GCC 4.4.1, and I'm only interested in them working with GCC.
こんにちは、
理解できないオブジェクト構築ステートメントに出くわしたのはほんの数回ではありませんでした。そして、それによってどのような曖昧さがもたらされているかに気付いたのは今日だけでした。それを再現する方法を説明し、それを修正する方法があるかどうかを知りたいです (C++0x は許可されています)。ここに行きます。
コンストラクターが引数を 1 つだけ取るクラスがあり、この 1 つの引数の型がデフォルトのコンストラクターを持つ別のクラスであるとします。例えば:
struct ArgType {};
class Class
{
public:
Class(ArgType arg);
};
スタック上に型のオブジェクトを構築しようとするとClass
、あいまいさが生じます。
Class c(ArgType()); // is this an object construction or a forward declaration
// of a function "c" returning `Class` and taking a pointer
// to a function returning `ArgType` and taking no arguments
// as argument? (oh yeh, loli haets awkward syntax in teh
// saucecode)
私はそれがオブジェクトの構築だと言っていますが、コンパイラはそれが関数本体内の前方宣言であると主張しています。まだ理解していない人のために、完全に機能する例を次に示します。
#include <iostream>
struct ArgType {};
struct Class {};
ArgType func()
{
std::cout << "func()\n";
return ArgType();
}
int main()
{
Class c(ArgType());
c(func); // prints "func()\n"
}
Class c(ArgType funcPtr()) // Class c(ArgType (*funcPtr)()) also works
{
funcPtr();
return Class();
}
まあ、十分な例です。あまりにも反慣用的なものにすることなく、誰でもこれを回避するのを手伝ってくれますか (私はライブラリ開発者であり、人々は慣用的なライブラリが好きです)?
- 編集
どうでも。これは、ほとんどの厄介な解析のだまされています。なぜ A a(()); 仕事?.
ありがとう、sbi。