我听过一些关于引用参考问题和这个解决方案的内容.我对C++委员会术语不是很了解,但我理解链接中的"Moved to DR"注释意味着这是符合标准的编译器应遵循的当前解释.
我有这个我无法理解的示例代码:
template <typename T>
struct C {
void f(T&) { }
void f(const T&) { }
};
int main() {
C<int> x; // OK
C<int&> y; // compile error: f cannot be overloaded
C<const int&> z; // compile error: f cannot be overloaded
}
Run Code Online (Sandbox Code Playgroud)
我理解错误C<const int&>:使用DR#106中的规则,我们得到两个具有相同签名f(const int&)的方法.我不能得到的是C<int&>:它不应该生成完全相同的代码C<int>(至少根据Stroustrup的分辨率)?
这段代码编译(正如我所料):
typedef void __stdcall (*Func)();
struct A {
static void __stdcall f() { }
};
int main() {
Func p = A::f;
}
Run Code Online (Sandbox Code Playgroud)
但是这一个:
struct A {
typedef void __stdcall (*Func)();
static void __stdcall f() { }
};
int main() {
A::Func p = A::f;
}
Run Code Online (Sandbox Code Playgroud)
失败时出现不太有用的错误消息:
error: invalid conversion from `void (*)()' to `void (*)()'
Run Code Online (Sandbox Code Playgroud)
我在Vista下使用g ++ 3.4.2(我知道,它很古老,但我现在无法访问任何其他环境).显然我在这里遗漏了一些东西.任何帮助,将不胜感激.