代码
#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,而另一个构造函数(据说)不应该。
所以,我要么非常困惑,要么发生了什么事!请帮忙!