问题标签 [decltype]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
274 浏览

c++ - 条件表达式中的右值引用

T 应该是什么?

根据 gcc (4.7),它是long. 根据 clang(主干),它是long&&. 这种差异导致 clang 无法编译使用 gcc 4.7 的 libstdc++ 的代码。谁是对的?

更新:正如ildjarn指出的那样,Clang 是正确的,正如Richard Smith指出的那样,错误 libstdc++ 是由于标准中的错误造成的。这是相关的 GCC 错误相关的缺陷报告

0 投票
4 回答
3239 浏览

c++ - 在 C++11 中是否有在模板中获取成员指针类型?

我知道这在 C++03 中是不可能的,但我希望有一些新的巫毒教可以让我这样做。见下文:

有没有办法在 C++11 中做到这一点?decltype 有帮助吗?

** 更新:使用 Vlad 的示例我在想这样的事情会起作用(警告:我没有编译,因为我现在正在构建具有 decltype 支持的编译器)

这行得通吗?

0 投票
1 回答
783 浏览

c++ - C++ 中的通用函数包装器可能吗?

当我boost::fusion::fused在使用 decltype 时查看函数包装器中的错误时,就会出现这种情况。问题似乎是无效的 decltype 是编译错误,即使不会使用需要它的模板实例化,我也不知道如何解决这个问题以创建通用函数包装器。

这是我对单参数包装器的尝试:

问题是,这不适用于非 const 版本的参数不能转换为 const 版本的参数的情况。例如:

在我看来,由 引起的 decltype 表达式的失败void operator()(y) const应该只是导致该函数由于 SFINAE 而被删除。

0 投票
1 回答
264 浏览

c++ - 为什么下面的代码用 MSVC++ 编译?

为什么,只是为什么任何地方都没有operator==定义!

我真的很想了解这里发生了什么,以提供有关 MS Connect 的详细错误报告。我的疯狂之旅始于Lounge<C++> 聊天室……

(注意:GCC和 Clang 都不接受此代码。)

哦,顺便说一句,添加私有X(int)ctor 会导致编译失败:

输出:

0 投票
3 回答
4859 浏览

c++ - 为什么私有成员变量上不允许使用 decltype?

假设我有这样的课程:

稍后,我想要另一个与bar. 如果我能做到这一点,这对我来说是有意义的:

但这不起作用。编译器告诉我'std::vector< int > Foo::bar' 是 private

所以我最终不得不使用这样的东西:

哪个有效,但看起来一团糟。也许有更简单的方法来做到这一点;我不太确定。但我真正想知道的是为什么我不能只使用decltype(Foo::bar). 为什么有人要关心这bar是私人的?这不像我实际上正在访问该变量。

decltype是语言的一个新特性。我只是不明白为什么它被设计为不适用于私有变量。

0 投票
1 回答
616 浏览

c++ - c++0x中auto和decltype的区别

我在使用 auto 和 decltype 时遇到问题。

以上代码在GCC4.7中运行良好。我可以使用 'new auto(a[0]*b[0])' 为 a[0]*b[0] 类型分配内存吗?在这种情况下,我无法区分 decltype 和 auto 之间的区别。

0 投票
5 回答
1053 浏览

c++ - 在 C++11 中使用 decltype() 时出错(在 gcc 4.7.0 中创建不透明的错误消息)

使用以下代码(我的原始代码的简化版本)

gcc 4.7.0 出现以下错误:

test.cc: 在函数decltype (std::abs(x.diff(y))) dist(const A<X>&, const A<Y>&)中 [with X = double; Y = double; decltype (std::abs(x.diff(y))) = double]':

test.cc:5:5:错误:double A<double>::a是私有的

突出显示的行:错误:在此上下文中

这个错误信息显然不是很有帮助。我的代码有错误吗?或者这是编译器的问题?

EDIT1:朋友声明没有帮助。

EDIT2:避免使用A<Y>::a也没有帮助。

EDIT3:与EDIT2一起终于解决了这个问题。的decltype()定义中dist()需要decltype()for A<X>::diff(),而后者又使用A<X>::a,它在第一个上下文中是私有的。

EDTI4:Rook 的使用建议typename std::common_type<X,Y>::type也有效!

EDIT5:但请参阅 Jonathan Wakely 对这个问题的回答

0 投票
1 回答
545 浏览

c++ - 什么更好用于自动返回类型:decltype 或 std::common_type<>::type (如果可能)?

作为对我最后一个问题的回答,建议尽可能std::common_type<X,Y>::type在自动返回类型的声明中使用,而不是我原来的decltype(). 但是,这样做我遇到了问题(使用 gcc 4.7.0)。考虑以下简单代码

什么时候,代码USE_DECLTYPE可以#defined在 gcc 4.7.0 下编译并运行良好。但除此之外,中指示的行main()调用乘法 2,如果没有错的话,这似乎很奇怪。这可能是使用的后果/副作用std::common_type还是 gcc 的错误?

我一直认为返回类型与选择众多拟合模板函数中的哪一个无关......

0 投票
2 回答
1342 浏览

c++ - 在 decltype 中使用 this 指针

示例(编译良好)

问题

如果我this在 decltype (ie decltype(this->f())) 中添加指针,我会在 gcc 4.7.0 中得到以下编译错误:

this不允许在 decltype 中使用吗?有人可以帮助我了解问题所在吗?

编辑

这已作为错误提交

0 投票
1 回答
916 浏览

c++ - 模板函数的返回类型

信息:

我目前正在尝试学习模板元编程(通过遵循这本书)。他们给出的一个有用的例子是维度分析。我按照书中的方式实现了它,一切都很好;看这里

然而,我的问题是,我想使用混合类型的维度分析框架。我的意思是你可以说一个具有质量维度的标量乘以一个向量与加速度的维度来给出一个向量力。正如链接中所示,它们仅适用于T所有操作的输入和输出的相同类型。

我有一个 3-vector 类,它具有所有必要的操作,用于乘以/除以标量等,所以我想做类似的事情

第一次尝试:

为了实现这一点,我尝试扩展书中的示例来处理两种不同的类型作为输入operator*operator/但是在返回类型方面我碰壁了。

我知道这里的返回类型double * vect是,vect但如果它们是相反的,vect * double它仍然是vect. 更差; 原则上返回类型可以是任何东西。所以我想要一种方法将其扩展operator*到类似的东西

哪里X是返回类型q1.value()*q2.value()并且是在编译时推导出来的。我尝试简单地将另一个模板类添加T3到签名中并让它返回T3,但它似乎无法推断出T3应该是什么。

第二次尝试:

接下来我尝试使用decltype如下

然而,这会引发大量难以理解的编译器错误。

问题:

那么我的问题是,我是否decltype以正确的方式使用但缺少一些语法,例如typename某处的说明符?或者; 甚至可以这样做吗?如果不是,如何计算函数的返回类型?

谢谢。