2012-01-30 3 views
3

Возможно ли статически напечатать аргументы, заданные std::bind? Я испытываю искушение использовать его, но это позволяет мне с чем угодно; например, std::bind(1,2); принимается. В качестве альтернативы я мог бы свернуть свое собственное решение, используя std::result_of.Может ли std :: bind быть проверен во время компиляции?

+1

Я получаю для: '{auto x = std :: bind (1,2); } error: нет соответствующей функции для вызова 'bind (int, int)', вы уверены, что используете ее надлежащую реализацию? Многие вещи не проверяются до тех пор, пока не будет использован «op()» (поскольку он использует шаблоны). Но он не должен принимать вещи, которые обычный вызов функции не принимал бы. – PlasmaHH

+0

@PlasmaHH: Какую реализацию вы используете? GCC 4.5.1 и libC++ TOT принимают это. – Xeo

+0

Я использую GCC 4.5.3. 'auto qq = std :: bind (1,2);' не дает мне никакой ошибки. – user2023370

ответ

2

Я еще не уверен, может ли быть сделано bind, чтобы надежно отвергнуть такие конструкции или нет. Но если это возможно, то это будет расширение.

Статья Requires в стандарте сообщает клиенту, что он должен делать, чтобы избежать неопределенного поведения. Это не говорит поставщику, что он должен делать, чтобы соответствовать. Таким образом, std::bind(1,2) - это неопределенное поведение. Он мог сделать что угодно. Причинение ошибки времени компиляции было бы хорошим неопределенным поведением, но не обязательным.

+0

О! Это хорошо знать. Я думал, что «Требовать» означает требование для реализации. – Xeo

+0

@Howard Hinnant: Кажется, GCC 4.7.0 (20120128) теперь отклоняет 'std :: bind (1,2)'; хотя он принимает функции рядом с слишком небольшим количеством аргументов (хотя нулевые аргументы дают ошибку). Как вы уже описали, один поставщик компилятора может определить «привязку» одним способом, а другой - другим. Благодарю. – user2023370

Смежные вопросы