Я застрял, прочитав описание std::bind в N3225, в подразделе 20.8.10.1. Он говорит, что следующее должно печатать 1, но я думал, что bind должен скопировать свои аргументы, и поэтому он должен печатать 0. Если вы хотите ссылаться на переданный аргумент, нужно использовать std::ref, правильно?
void f(int &a) { a = 1; }
int main() {
int a = 0;
std::bind(f, a)();
std::cout << a << std::endl;
}
Выходы GCC 0, соглашаясь с тем, что я думал, что все работает. Но N3225 говорит, что std::bind(f, a1) должен вернуть оболочку вызова, которая при вызове wrapper() вызовет INVOKE(f, v1), где v1 будет a (аргумент, который я передал, другими словами, используя binds входящий параметр, который является идеальным параметром пересылки, std::forward<A1>(a1)).
INVOKE(f, a) определяется в соответствии с 20.8.2 на f(a). Таким образом, это определяет, что вызов обертки возвращенного вызова передает исходный аргумент. Что мне не хватает?