Почему std :: is_assignable не работает с примитивными типами?(Подтверждение) - PullRequest
0 голосов
/ 20 сентября 2018

Чтобы быть более точным, почему std::is_assignable_v<int, int> << '\n'; возвращает false?Это потому, что у int нет перегруженного оператора присваивания (примитивный тип и все)?

(кстати, std::is_trivially_assignable_v<int, int> тоже дает false.)

Обратите внимание, что это: struct Structure {}; std::is_assignable<class Structure, class Structure>::value; вернет true, потому что перегруженный оператор присваивания неявно определен для Structure.

Я прав до сих пор?Если это так, то я полагаю, было бы нетривиально улучшить is_assignable, чтобы принимать и примитивные типы?Иначе, есть ли намеки на такой возможный обходной путь?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Если выражение std::declval<T>() = std::declval<U>() правильно сформировано в неоцененном контексте

std::is_assignable<int, int>::value << '\n' // 1 = 1; wouldn't compile

https://en.cppreference.com/w/cpp/types/is_assignable

0 голосов
/ 20 сентября 2018

int нельзя присвоить int.Если вместо этого вы передадите int& в качестве первого аргумента, то, как и ожидалось, оба значения is_assignable и is_trivially_assignable вернут true.

cppreference , godbolted

#include <type_traits>

int main()
{
    static_assert(!std::is_assignable_v<int, int>);
    static_assert(std::is_assignable_v<int&, int>);
    static_assert(!std::is_trivially_assignable_v<int, int>);
    static_assert(std::is_trivially_assignable_v<int&, int>);

    return 0;
}

Не очень интуитивная часть - is_assignable_v<mytype, mytype> верно, потому что mytype{} = mytype{}; тоже работает, и только is_assignable_v<mytype const, mytype> ложно.

...