, [...]

орое время назад меня смутило следующее поведение некоторого кода, когда я хотел написатьis_callable<F, Args...> черта характера. Разрешение перегрузки не вызовет функции, принимающие аргументы неконстантным ref, верно? Почему это не отклоняется в следующем, потому что конструктор хочетTest&? Я ожидал, что это займетf(int)!

struct Test {
  Test() { }

  // I want Test not be copyable from rvalues!
  Test(Test&) { }

  // But it's convertible to int
  operator int() { return 0; }
};

void f(int) { }
void f(Test) { }

struct WorksFine { };
struct Slurper { Slurper(WorksFine&) { } };
struct Eater { Eater(WorksFine) { } };

void g(Slurper) { }
void g(Eater) { } // chooses this, as expected

int main() {
  // Error, why?
  f(Test());

  // But this works, why?
  g(WorksFine());
}

Сообщение об ошибке

m.cpp: In function 'int main()':
m.cpp:33:11: error: no matching function for call to 'Test::Test(Test)'
m.cpp:5:3: note: candidates are: Test::Test(Test&)
m.cpp:2:3: note:                 Test::Test()
m.cpp:33:11: error:   initializing argument 1 of 'void f(Test)'

Не могли бы вы объяснить, почему один работает, а другой нет?

Ответы на вопрос(2)

Ваш ответ на вопрос