此问题基于C++参考部分:依赖名称 - 依赖名称的模板消歧器.
我已经理解在模板类中调用模板成员函数时,关键字模板是必要的,以使编译器知道以下括号用于指示模板参数.就像本节中使用的示例一样.
template<typename T>
struct S {
template<typename U> void foo(){}
};
template<typename T>
void bar()
{
S<T> s;
s.foo<T>(); // error: < parsed as less than operator
s.template foo<T>(); // OK
}
Run Code Online (Sandbox Code Playgroud)
但是,在后续部分中,它描述了模板名称何时出现在成员访问表达式中(在 - >之后或之后.),如果在表达式的上下文中存在通过普通查找找到的具有相同名称的模板,则不需要消除歧义. ..
然后它附带以下代码.与前面的例子相比,它定义了set函数,其名称也存在于标准库中.同时,使用std :: set设置为在模板函数中显示设置模板.在这种情况下,即使没有提供关键字模板,它仍然可以正常工作.
#include <set>
using std::set; // makes 'set' visible to lookup from bar
template<typename T>
struct S {
template<typename U> void set(){}
};
template<typename T>
void bar()
{
S<T> s;
s.set<T>(); …Run Code Online (Sandbox Code Playgroud) 当我查看代码片段以获得std :: common_type的可能实现时
template <class ...T> struct common_type;
template <class T>
struct common_type<T> {
typedef decay_t<T> type;
};
template <class T, class U>
struct common_type<T, U> {
typedef decay_t<decltype(true ? declval<T>() : declval<U>())> type;
};
template <class T, class U, class... V>
struct common_type<T, U, V...> {
typedef common_type_t<common_type_t<T, U>, V...> type;
};
Run Code Online (Sandbox Code Playgroud)
如何获得两个模板参数的公共类型的部分让我感到困惑.它是使用decltype的三元运算符.
众所周知,是否返回第二个或第三个操作数取决于第一个操作数的值.在这个片段中,第一个操作数为true,这意味着表达式的返回值将始终为declval<T>().如果这是我认为没有意义的...因此,我尝试了以下测试
int iii = 2;
float fff = 3.3;
std::cout << typeid(decltype(false? std::move(iii):std::move(fff))).name() << std::endl;
std::cout << typeid(decltype(std::move(iii))).name() << std::endl; …Run Code Online (Sandbox Code Playgroud) 我使用nodejs-mode的Emacs 24,但是当我键入:
M-x nodejs
Run Code Online (Sandbox Code Playgroud)
它提示垃圾提示[0J>,现在即使我已经添加到下面
(setq ansi-color-for-comint-mode t)
Run Code Online (Sandbox Code Playgroud)
在emacs文件中.它仍然无效.
所有相同的,如果我node打开目录Emacs shell-mode,那么我会得到一个更烦人的提示,如下所示:
ryu@ryu:~$ node
[1G[0J> [3G
Run Code Online (Sandbox Code Playgroud)
有谁知道它为什么会这样?