Почему этот код компилируется? (проверено с помощью g++ и clang++)
Следующий код предназначен для фабричного метода, который принимает функцию и создает из нее пересылающую функцию std::function. Как видите, лямбда внутри принимает const Arg&
аргументов и перенаправляет их в заданную функцию.
В main()
я использую factory()
для создания пересылки на test_func()
, которая принимает неконстантный ссылочный параметр. Чего я не понимаю, так это почему это не приводит к ошибке об исключении квалификатора const из аргумента.
Обратите внимание, что действительно экземпляр класса C
, созданный в main()
, передается без создания каких-либо копий.
#include <functional>
#include <iostream>
class C
{
public:
C() {}
C(const C&)
{
std::cout << "C copy\n";
}
};
int test_func(C& cref)
{
return 0;
}
template<typename Ret, typename... Arg>
std::function<Ret (const Arg&...)> factory(Ret (*func) (Arg...))
{
return [ func ] (const Arg&... arg) -> Ret {
return (func)(arg...);
};
}
int main() {
auto caller = factory(test_func);
C c;
caller(c);
return 0;
}
Arg
==C&
,const Arg&
(илиArg const&
) ==C& const&
==C&
. - person Xeo   schedule 29.10.2013C& const& == C&
. §8.3.2/1 гласит: Cv-квалифицированные ссылки имеют неправильный формат, за исключением случаев, когда cv-квалификаторы вводятся с помощью typedef (7.1.3) или аргумента типа шаблона (14.3), и в этом случае cv -квалификаторы игнорируются. - person MWid   schedule 29.10.2013