次のコードは で失敗しpush_back
、 で成功しemplace_back
ます:
#include <vector>
volatile int x = 0;
int main()
{
std::vector<int> vec;
vec.emplace_back(x);
vec.push_back(x); // error: no matching function for call to 'std::vector<int>::push_back(volatile int&)'
}
参照を取り、その参照から暗黙的に修飾子push_back
をキャストしようとするため、失敗することを理解しています。volatile
ただし、参照emplace_back
も受け取ります (rvalue-references は参照です)。なぜ扱いが違うのでしょうか?