operator auto不是c++标准吗

C++语言 码拜 9年前 (2016-05-07) 1744次浏览
	inline operator auto ()->decltype (to ()) {
		return to () ;
	}

某类中有to函数转换成其它类型,现在重载运算符写成这样
在VS上可用,但是g++报错error: invalid use of “auto” in conversion operator
怎么解决?

解决方案

5

在C++11之前,auto关键字用来指定存储期。
在新标准中,它的功能变为类型推断。auto现在成了一个类型的占位符,通知编译器去根据初始化代码推断所声明变量的真实类型。各种作用域内声明变量都可以用到它。例如,名空间中,程序块中,或是for循环的初始化语句中。
标准不一样吧,看编译器的支持程度的。

5

引用:

没见过这种用法,试了一下 vc 和 g++ 都能认,clang 不认,不过也可能是本人的 clang (3.6) 比较旧的缘故,莫非是 c++17 的新货?

N4035。还没过审,但是operator auto这块好像没啥异议。估计实现挺cheap的,g++/vc就直接做进去了。

5

引用:

没见过这种用法,试了一下 vc 和 g++ 都能认,clang 不认,不过也可能是本人的 clang (3.6) 比较旧的缘故,莫非是 c++17 的新货?

表示clang 3.7得开microsoft extension才能过

20

不允许。trailing-return-type 必须在 decl-specifier-seq 中的 type-specifier-seq 只包含一个 auto 的时候才能用。user-defined conversion function 的声明中要么不出现 decl-specifier-seq,要么 decl-specifier-seq 中不含有 type-specifier-seq

引用:

没见过这种用法,试了一下 vc 和 g++ 都能认,clang 不认,不过也可能是本人的 clang (3.6) 比较旧的缘故,莫非是 c++17 的新货?

至少这边的测试是 g++ 过不了

20

又鼓捣了一下。
g++6.1 编译错误,低版本的能编译,看起来像是个 bug fix,这么看 g++ 认为标准不允许。
clang 基本全部版本都编译错误,看来 clang 一直认为标准不允许。
vc 能编译,但 vc 的质量实在是劣迹斑斑,这次八成 vc 又错了。
翻了半天没找到哪里明确说行或不行,姑且认为 D41D8CD98F 在 8 楼说的就是原因吧。
另外,主楼的程序可以这样写,就符合标准了。

operator auto () 
{
    return to() ;
}

全部支持 -std=c++1z 的 g++ 和 clang 都认,生成的汇编也是正确的。
但 vs 2015 update 2 里的 vc 出编译错误。唉,该编译的出错,不该认的能行,这货真悲催啊。
ps. 最新的 draft 是 n4604.

5

不要鼓捣这些属于编译器的细枝末节问题,不要考察编译器对一些不常用的语法的支持程度。
能在实际开发中使用的、项目团队都理解的技术、语法,才是好的。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明operator auto不是c++标准吗
喜欢 (0)
[1034331897@qq.com]
分享 (0)