考虑以下程序:
#include <cstddef>
#include <cstdio>
void f(char const*&&) { std::puts("char const*&&"); } // (1)
void f(char const* const&) { std::puts("char const* const&"); } // (2)
template <std::size_t N>
void f(char const (&)[N]) { std::puts("char const(&)[N]"); } // (3)
int main()
{
const char data[] = "a";
f(data);
}
Run Code Online (Sandbox Code Playgroud)
哪个f应该叫?为什么?
三个编译器的最新发布版本不同意这个问题的答案:
在不同的C++ 0x草案中,重载决策规则是否发生了很大变化?或者,这两个编译器真的完全错了吗?哪个重载是根据最新的C++ 0x草案选择的正确重载?
无法弄清楚如何准确地说出问题,所以这是一个例子:
鉴于此功能原型:
void Foo(myClass* bar);
Run Code Online (Sandbox Code Playgroud)
我想阻止这种用法:
Foo(new myClass());
Run Code Online (Sandbox Code Playgroud)
而是需要先前创建的对象:
myClass* bar = NULL;
bar = new myClass();
Foo(bar);
Run Code Online (Sandbox Code Playgroud)
要么
myClass bar;
Foo(&bar);
Run Code Online (Sandbox Code Playgroud)
谢谢.
这是一个澄清的例子:
void Mouse::SetImage(BITMAP* image, int focusX, int focusY) {
if(_image) {
set_mouse_sprite(NULL);
set_mouse_sprite_focus(0, 0);
show_mouse(NULL);
destroy_bitmap(_image);
_image = NULL;
}
if(image) {
_image = create_bitmap(image->w, image->h);
clear_bitmap(_image);
blit(image, _image, 0, 0, 0, 0, image->w, image->h);
}
if(image == NULL) {
focusX = 0;
focusY = 0;
}
_focusX = focusX;
_focusY = …Run Code Online (Sandbox Code Playgroud)