пустой объект литерала std :: string, переданный по прямой ссылке в MS VS 2017? - PullRequest
1 голос
/ 23 апреля 2019

Можете ли вы объяснить мне странное поведение с прямыми ссылками в MS VS 2017? Конструкторы для rvalue std :: strings (a2 & a3) получают пустые строки.

#include <string>
#include <iostream>
#include <type_traits>
using namespace std;

class A {
    string text{};
public:
    template <typename T,
              typename = typename enable_if_t< !is_base_of_v<A, decay_t<T>> && 
                                               !is_integral_v<remove_reference_t<T>> >>
    explicit A(T&& str) : text(forward<T>(str)) { 
        cout << str << endl;
    }
    explicit A(int x) : text(to_string(x)) {}
};

int main()
{
    string s = "hello"s;
    A a1(s);
    A a2(" world"s); // why?
    A a3(string(" world")); // why?
    A a4(" world");
    A a5(34);
    A a6(a2);
    return 0;
}

output

1 Ответ

2 голосов
/ 23 апреля 2019

std::forward<T>(x) - это условное перемещение - если T не является ссылкой на lvalue, x будет перемещено.В случае a2 и a3 ваш str перемещается в элемент данных text перед его печатью.При его печати может произойти все что угодно, поскольку состояние str не указано.

...