On Wednesday, 17 September 2014 at 08:57:36 UTC, Szymon Gatner
wrote:
On Wednesday, 17 September 2014 at 08:52:58 UTC, Arjan wrote:
On Tuesday, 16 September 2014 at 15:30:49 UTC, Andrei
Alexandrescu wrote:
http://www.slideshare.net/yandex/rust-c
C++ code:
std::string get_url() {
return "http://yandex.ru";
}
string_view get_scheme_from_url(string_view url) {
unsigned colon = url.find(':');
return url.substr(0, colon);
}
int main() {
auto scheme = get_scheme_from_url(get_url());
std::cout << scheme << "\n";
return 0;
}
string_view has an implicit constructor from const string&
(see "basic_string_view(const basic_string<charT, traits,
Allocator>& str) noexcept;" in
https://isocpp.org/files/papers/N3762.html). The function
get_url() returns an rvalue, which in turn gets bound to a
Forgive me my ignorance but get_url() returns a std::string
(on the stack), so its address can be token.
And iirc the explainer Scott Meyers explained once "iff you
can take its address its not a rvalue its a lvalue". So isn't
the get_scheme_from_url() not simply holding a const ref to
temporary? (which most compiler warn about)
...Or am I missing the point?
reference to const and implicitly passed to string_view's
constructor. The obtained view refers to a dead string.
Andrei
[ Sorry for double posting, i must have double clicked on "reply"
button accidentally. ]
std::string returned from get_url() is a temporary and hence a
"rvalue". In fact it's address cannot be taken. It is often
helpful to think of lvalues as things that can appear on the left
side of assignment expression.