Size: a a a

2020 July 04

AB

Artöm Bakri Al-Sarmi... in pro.cxx
magras
хм. Это чтобы можно было мимкрировать под другой класс? Что то вроде
template <class T>
class Foo {
 T m_inner;
public:
 template <class U>
 explicit(!std::is_convertible_v<U, T>) Foo(U&& u): m_inner(std::forward<U>(u)) {}
};
Да, для оберток
источник

A

Alex in pro.cxx
Ничего не понимаю:
error C2938: 'std::enable_if_t<false,int>' : Failed to specialize alias template
источник

A

Alex in pro.cxx
теперь точно SFINAE context
источник

m

magras in pro.cxx
Artöm Bakri Al-Sarmini
Да, для оберток
И в правду в std::optional есть несколько конструторов помеченных (conditionally explicit). Правда было это еще в 17 стандарте.

upd: Видимо в 17ом стандарте это делали через пару коструторов с enable_if.
источник

A

Alex in pro.cxx
Как думаете, что ему не нравится? GCC компилит.
https://godbolt.org/z/bH2iZC
источник

A

Alex in pro.cxx
но в GCC это условие, как раз, true
источник

m

magras in pro.cxx
Alex
но в GCC это условие, как раз, true
sizeof(size_t) == 8 && !std::is_same_v<size_t, uint64_t> - всегда будет false.
источник

A

Alex in pro.cxx
нет, не будет
источник

A

Alex in pro.cxx
size_t может быть unsigned long, а может быть unsigned long long
источник

A

Alex in pro.cxx
это вечный источник ошибок компиляции на других платформах, хочу исправить раз и навсегда
источник

m

magras in pro.cxx
Alex
нет, не будет
При CHAR_BITS=8 sizeof(uint64_t) всегда будет равен 8. То есть это выражение на всех адекватных платформах эквивалентно x && !x.
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
magras
И в правду в std::optional есть несколько конструторов помеченных (conditionally explicit). Правда было это еще в 17 стандарте.

upd: Видимо в 17ом стандарте это делали через пару коструторов с enable_if.
Так и делали, так же для пары и кортежа
источник

A

Alex in pro.cxx
sizeof(uint64_t) всегда будет равен 8 - и что? Я нигде и не проверяю sizeof(uint64_t). Что-то вы неправильно распарсили условие)
источник

m

magras in pro.cxx
Alex
sizeof(uint64_t) всегда будет равен 8 - и что? Я нигде и не проверяю sizeof(uint64_t). Что-то вы неправильно распарсили условие)
Ну убери отрицание в выражении и посмотри соберется ли.
источник

A

Alex in pro.cxx
Конечно, собралось, условие же поменялось, исчез substitution failure. И что? Мне нужно, чтобы работало в обоих случаях.
источник

m

magras in pro.cxx
Alex
Конечно, собралось, условие же поменялось, исчез substitution failure. И что? Мне нужно, чтобы работало в обоих случаях.
Да, туплю. Извиняюсь.
источник

🎄T

🎄🎊 R 🎅 Tb| ✡️ 🎊🎄... in pro.cxx
Alex
Ничего не понимаю:
error C2938: 'std::enable_if_t<false,int>' : Failed to specialize alias template
В std::enable_if_t вроде нельзя явно пихать false, надо чтобы выражение считалось при инстанцировании. Мб
std::enable_if_t<!std::is_same_v<T,T>, int>
источник

A

Alex in pro.cxx
Хмм. Но у меня выбран компилятор х64, поэтому первая часть условия будет true, а вторая через шаблон. Проблема в том, что это значение не dependent? Нужно написать трейт?
источник

A

Alex in pro.cxx
и опять, почему с -pedantic-errors GCC всё равно компилит
источник

ПК

Побитый Кирпич... in pro.cxx
Alex
А можно через SFINAE выключить нешаблонный конструктор? У него нет возвращаемого типа.
SFINAE только на шаблонное действует
источник