Я застрял, прочитав описание 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)
. Таким образом, это определяет, что вызов обертки возвращенного вызова передает исходный аргумент. Что мне не хватает?