コード
#include <iostream>
using namespace std;
#define PF cout << __PRETTY_FUNCTION__ << endl;
class berlp {
public:
berlp() { }
void p() { }
};
template <typename T>
class derp {
public:
derp() = default;
derp(const T & a) : mem(a) {
a.p();
mem.p();
PF
}
template <typename U>
derp(U && a) : mem(std::forward<U>(a)) {
PF
}
T mem;
};
int main(int argc, const char * argv[])
{
berlp one;
derp<berlp &> f(one); // problems with this list below
derp<const berlp &> h(one); // problem with this follows
return 0;
}
XCode と CLang を使用した出力 これはすべて正常にコンパイルされ、出力は次のとおりです...
derp<berlp &>::derp(const T &) [T = berlp &]
derp<const berlp &>::derp(U &&) [T = const berlp &, U = berlp &]
問題
derp<berlp &> f(one);
: derp コンストラクターの ap() は失敗するはずです。これは、"a" が参照の崩壊後の "const berlp &" であり、p() が const でないためです。次に、"a" (const berlp &) を使用した "mem" (berlp &) の初期化は機能しません。「derp(const T & a)」の「const」は何もしていないようです。最後に、const を壊さずにこのすべてを行うように見えるテンプレート化されたコンストラクターではなく、最初のコンストラクターを使用するのはなぜですか?
derp<const berlp &> h(one);
: なぜこの呼び出しはテンプレート化されたコンストラクターを使用するのですか? 何も壊れないように見えるので、これはそれほど深刻な問題ではありませんが、コンストラクターで渡された berlp を変更できますが、他のコンストラクターは (おそらく) すべきではありません。
だから、私はひどく混乱しているか、何かが起きています! 助けてください!