I'm using Visual Studio 2013 Express.
class B{
public:
vector<char>& a;
int& b;
B(vector<char>& i,int& c) :a(i),b(c) {}
};
int main(){
int l=3;
vector<char> h;
shared_ptr<B> bb (new B(std::move(h),l));
return 0;
}
Why can the code be accepted?When I changed the argument l to std::move(l),the compiler will complain "cannot convert argument 2 from 'int' to 'int &'".
This is a language extension available in the Visual C++ compiler and has existed for quite some time now. The extension allows you to bind an rvalue (tempoarary) to a non-const reference and extend the lifetime of value as if you were binding to a const
reference.. If you enable warning level 4 or explicitly enable warning C4239 the compiler will alert you any time the extension is used.
The documentation for C4239 includes an example that is similar to what's in your question.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With