Суть в том, что то, что вы пытаетесь сделать, невозможно в portable C++. std::vector<>::push_back
гарантированно будет перегружен в компиляторах C++ 11, поскольку, как минимум, должна быть перегрузка для lvalues и перегрузка для rvalues.
Обычно, принимая адрес перегруженной функции члена, §13.4/1 в C++ 11 FDIS говорит нам, что мы можем контролировать, какие перегружать мы берем адрес таким образом:
Использование перегруженного имени функции без аргументов разрешено в определенных контекстах функции, указателю на функцию или указателю на функцию-член для определенной функции из набора перегрузки. Имя шаблона функции считается названным набором перегруженных функций в таких контекстах. Выбранная функция - это тип, идентичный типу функции целевого типа, требуемого в контексте. [Примечание: То есть, класс, членом которого является член, игнорируется при сопоставлении типа указателя-члена.-end примечание] Мишень может быть
- объект или ссылка инициализируется,
- левая сторона присваивания,
- параметр функции,
- параметр пользователя -определенной оператор,
- возвращаемого значения функции, функций оператора, или преобразований,
- явного преобразования типов, или
- не-тип шаблона-параметра.
Перегруженному имени функции может предшествовать оператор &
. Перегруженное имя функции не должно использоваться без аргументов в других контекстах, кроме перечисленных. [Примечание: Любой избыточный набор круглых скобок, окружающих перегруженное имя функции, игнорируется. -end примечание]
Проблема происходит от §17.6.5.5/2:
Реализация может объявить дополнительные невиртуальные сигнатуры функций члена в классе, добавив аргументы по умолчанию значения для сигнатуры функции-члена; , следовательно, адрес функции-члена класса в стандартной библиотеке C++ имеет неопределенный тип.
Следовательно, это не портативный, чтобы когда-нибудь адрес стандартной функции члена класса библиотеки, как тип такого выражения по определению непознаваем, за исключением на основе реализации, по-реализации.
предложил Люк Дантона обходной путь (в частности, с использованием лямбда) также то, что я бы рекомендовал:
std::vector<int> vec;
[&](){ vec.push_back(1); }();
Пожалуйста, вставьте в ошибку вы получаете. Даже если мы готовы помочь, мы не экстрасенсы. – ereOn
Я не вижу ошибки в этом. Я запускаю этот код, и он работает хорошо. Обязательно включите tr1/functional. –
Он не компилируется в VS2010, нет заголовка, только . Что я делаю не так? –
magenta