#include #include #include #include #include #ifdef _MSC_VER # include #endif template ::type = nullptr> typename T::pointer get_ptr(T& item) { return item.get(); } int main() { int a[] = { 0, 1, 2 }; auto ai = std::cbegin(a); int b[] = { 2, 1, 0 }; auto bi = std::cend(b); auto ci = std::size(a); std::unique_ptr u(new int(0)); // Intel compiler do not handle correctly 'decltype' inside 'invoke_result' get_ptr(u); #ifdef _MSC_VER // clang-cl has problems instantiating this constructor in C++17 mode // error: indirection requires pointer operand ('const _GUID' invalid) // return *_IID; IUnknownPtr ptr{}; IDispatchPtr disp(ptr); #endif std::optional oi = 0; return *u + *ai + *(bi - 1) + (3 - static_cast(ci)) + oi.value(); }