[问题] casting operator的问题

楼主: loveflames (咕啾咕啾魔法阵)   2017-10-30 16:10:52
开发平台(Platform): (Ex: Win10, Linux, ...)
http://rextester.com/l/cpp_online_compiler_gcc
在这地方测试的
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
gcc
问题(Question):
http://codepad.org/3WjlxLGF
f((string)FOO<int,int>());
上面这行编译不过
但只用隐式转型时没问题
强制转基本型别也可以(但要稍微改一下code)
如果casting operator不以template方式使用,例如指定string型别
则允许强制转型成string
想请教有人知道原因吗
作者: CoNsTaR ((const *))   2017-10-30 18:30:00
你这样子是在建构 FOO<int,int>,不是在呼叫 operator U欸还是现在 c++17 又有什么神奇的新规定了吗喔喔… 是我脑残了 XDD
楼主: loveflames (咕啾咕啾魔法阵)   2017-10-30 18:58:00
我的原始目的是模拟偏特化函数模板,想尝试看看functor以外的方法costructor缺点是无法回传,所以想了一个转型的解法至于17,是有一个ctor参数推导模板参数的新规定,类似函数那样
作者: CoNsTaR ((const *))   2017-10-30 19:18:00
template <typename T> T foo = (T)FOO<int,int>().operator T(); f(foo<string>);这样编译可以过欸,完全不知道原因…感觉是编译器的型别推论有问题?不过不只 gcc,clang 也这样真的满奇怪的
楼主: loveflames (咕啾咕啾魔法阵)   2017-10-30 19:26:00
VC++的行为也是一样
作者: notBeing (read and be read)   2017-10-30 19:27:00
因为 explicit conversion 要生成 temporary of stringtype请参照 C++ 03 standard 中5.4 explicit type conversion
作者: CoNsTaR ((const *))   2017-10-30 20:34:00
楼上是想讲 4.1.2 ?不过这和原 Po 的问题有什么关系吗
作者: PkmX (阿猫)   2017-11-03 20:28:00
对 因为static_cast是做direct-initializationC++17 多了 guaranteed copy elision 刚好可以处理这个case
楼主: loveflames (咕啾咕啾魔法阵)   2017-11-03 23:05:00
回到上面的原始目的,用ctor加转换函数的作法,在过程遇到太多问题了,还是乖乖回去用functor好

Links booklink

Contact Us: admin [ a t ] ucptt.com