考虑以下代码:
void MemMove8(void* dst, void* src)
{
char tmp[8];
memcpy(tmp, src, 8);
memcpy(dst, tmp, 8);
}
Run Code Online (Sandbox Code Playgroud)
MSVC (16.7.1) x86 with /O2 为此函数生成以下程序集:
; _dst$ = ecx
; _src$ = edx
mov eax, DWORD PTR [edx]
mov DWORD PTR [ecx], eax
mov eax, DWORD PTR [edx+4]
mov DWORD PTR [ecx+4], eax
Run Code Online (Sandbox Code Playgroud)
但如果输入和输出缓冲区重叠,这将不起作用(在某些情况下)。
生成的代码对我来说似乎是错误的;或者这是一个有效的转换,我在这里遗漏了什么?
如果定义了BREAK,则g ++ 4.6.3和4.7.2无法编译以下代码(在c ++ 0x模式下).
template<class T> struct Test {
Test(T&) {}
#ifdef BREAK
Test(T&&) = delete;
#endif
};
void func(Test<int> const&) {}
void func(Test<double> const&) {}
int main()
{
int x = 0;
func(x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误是
error: call of overloaded 'func(int&)' is ambiguous
Run Code Online (Sandbox Code Playgroud)
而铛3.2 RC2和VC11(如果我更换Test(T&&) = delete;用private: Test(T&&);)接受的代码.
我看不出哪里应该含糊不清.
这是一个g ++问题吗?(我不知道在gcc bug列表中搜索什么...)