5 ms·
IMO that's the typical experience with many of the features in modern C++ standards. You read about a really neat useful thing they added, something that seems
by MawKKe 2y ago
IMO that's the typical experience with many of the features in modern C++ standards. You read about a really neat useful thing they added, something that seems to provide a safe and practical way to overcome a shortcoming in the language. You may even get a little excited...until you try to actually use it and realize its full of new footguns and weird limitations
- fgkhax 2y agoYes, you read about std::variant on a blog and think that it is a sum type. Then you try it out and realize that it's a thin (type-safe) wrapper over tagged unions that is at least three times slower and has about 5 unreadable alternatives that replace simple switch statements. Then you find out that members of a "variant" are not really variant members but just the individual types that can be assigned to a union. For example, assigning to a non-const reference does not work (and obviously cannot work once you realize that std::variant is just syntax sugar over a tagged union). Most of these new additions since C++11 are just leaky abstractions and wrappers.
- galkk 2y agoOhh, and to make the use of a variant to look like pattern match over type you need to copy paste some template magic. https://schneide.blog/2018/01/11/c17-the-two-line-visitor-explained/ https://schneide.blog/2018/01/11/c17-the-two-line-visitor-ex... variants are a such disappointment at every step of trying to use them
- nly 2y agoA few code snippets of what you see as weaknesses of std::variant may be appropriate, as I couldn't figure out your complaint. Assigning to a variant taken by non-const& works fine for me. I personally would have liked to see recursive variant types and multi-visitation (as supported by boost::variant).
- amluto 2y agoI think the comment means: std::variant<int&, etc> does not work well.
- nly 2y agoJust use std::variant<int*, ...> References in C++ are just sugary pointers.
- robmccoll 2y agoReferences have one important property over pointers. They cannot be null.
- tstack 2y agoThey most certainly can be null as can “this”.
- cma 2y agoconst ref lifetime extension is important to, or operator overloading wouldn't be workable.
- gpderetta 2y agoReference_wrapper then.
- LowLevelMahn 2y ago
- gpderetta 2y ago> and obviously cannot work once you realize that std::variant is just syntax sugar over a tagged union It would be easy to make it work, there isn't necessarily a strict relation between the template parameter and the actual stored object. Not having reference variant members was a conscious decision, same as optional<T&>. Hopefully this will be fixed in the future.