- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
请考虑以下用例:
int main() {
std::shared_ptr<int> shared_ptr_to_int;
std::cout << typeid(int).name() << std::endl;
std::cout << typeid(decltype(*shared_ptr_to_int)).name() << std::endl;
if (std::is_same<decltype(*shared_ptr_to_int), int>::value) {
std::cout << "is same!\n";
}
else {
std::cout << "not the same!\n";
}
system("pause");
}
对于我的测试用例,我得到的结果“不一样”
我不确定为什么它不会导致 value 为真。有人可以向我解释一下这是怎么回事吗?
PS: 我的最终目标是将 shared_ptr 中存储的类型与另一个类型进行比较(在这个测试用例中这个类型是 int)
感谢您的关注!
最佳答案
当“取消引用”时 — 通过 std::shared_ptr<...>::operator*
— shared_ptr 结果是一个reference,这意味着decltype(*shared_ptr_to_int)
相当于int&
.
reference-to-int 和 int 不是同一类型,因此您会得到您所描述的行为。
取消引用 std::shared_ptr
产生一个引用,这样就可以实际进入并修改shared_ptr 当前正在处理的对象。
为了修复您的示例,您应该使用 std::remove_reference去除那个(可能出乎意料的)引用。
if (std::is_same<std::remove_reference<decltype(*shared_ptr_to_int)>::type, int>::value) {
...
}
你也可以传递 shared_ptr_to_int
作为 decltype 的操作数,然后使用结果作为限定符以进入 element_type
:
if (std::is_same<decltype(shared_ptr_to_int)::element_type, int>::value) {
...
}
typeid(...).name()
为两者返回相同的名称?当 typeid
被一个引用类型调用时,它会丢弃这个并将操作数当作一个非引用类型(即。它只会丢弃 &
)。
另外值得一提的是调用 typeid(...).name()
的结果是实现定义的 — 永远不要过分信任返回值。该函数甚至可能为完全不同的类型返回相同的名称——实际上没有任何保证(从标准的角度来看)。
进一步阅读:
关于c++ - decltype 和 is_same 给出令人困惑的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33067373/
由 this question 触发,我想知道是否允许这样做: template T foo(){return T{};} struct bar {}; int main() { bar a
我正在尝试以一种通用的方式实现 group_by 方法,我可能已经实现了它(除了它不适用于 C 数组),但代码对我来说仍然很难看...... 有没有更简单的方法来做我想做的事(+让它适用于所有容器和
这个问题在这里已经有了答案: What is decltype with two arguments? (2 个答案) 关闭 7 年前。 我遇到了一个decltype(),有两个参数作为模板函数的返
这是问题的后续:What does the void() in decltype(void()) mean exactly? . decltype(void()) 编译得很好,void() 在这种情况
这是我第一次使用decltype,我不太确定我是否正确使用它。该代码确实编译并且似乎适用于像 char 和 int 这样的 POD。 但是,我想知道我是否会遇到更复杂的数据类型的任何问题 - 其他人警
我一直在使用解析为与声明相同类型的定义中的推导返回类型。这有效: template struct Cls { static std::size_t f(); }; template declt
我发现它们是不同的,并且语言标准规定了每个语句应该检索什么样的类型(变量和表达式之间的差异)。但我真的很想知道为什么这两种类型应该不同? #include int x=0; decltype((x))
关于 decltype(x) 和 decltype((x)) 之间的区别,我已经读过很多遍了。一个例子如下。 x is the name of a variable, so decltype(x) i
我有一个简单的模板化包装器结构,其成员函数在其模板类型的对象上调用 .error()。 template struct Wrapper { T t; decltype(auto) f
decltype(auto) 和 decltype(returning expression) 作为函数(模板)的返回类型 if expr 有什么区别在这两种情况下都使用不带括号? auto f()
我在想 decltype((x)) 给出了 & 引用类型,但是一些实验表明还有其他事情: #include int main(){ int x = 0; decltype((x)) r
例如,简单的恒等仿函数: template class identity { public: constexpr auto operator ()(T && i) -> decltype(s
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: decltype and parenthesis 我在维基百科上找到了这个: auto c = 0;
// g++ 7.3 template struct td; int main() { int a = 1; td t1; td t2; return 0; } 编译结果如下: 错误:
这确实是一个 C++14 问题。而且它的理论性多于实践性。 有时您会零碎地构建一个函数的结果: int f( int x, int y ) { int a; //... re
我试图检测成员函数 baz() 的存在在模板参数中: template struct ImplementsBaz : public std::false_type { }; template stru
考虑以下代码:(Ideone) struct S { int a() {return 0;} decltype(a()) b() {return 1;} }; 它给了我以下错误: er
(如果您是 C++11 专业人士,请跳至粗体段落。) 假设我想编写一个模板方法,该方法调用并返回传递的对象的结果,该对象的类型是模板参数: template ReturnType doSomethin
代码 #include int main() { int a=3; int *p=&a; decltype (a) k1; decltype (*p) k2;
我是 C++ 新手。我正在尝试学习 decltype 的概念。我在网上看到这段代码。我将 decltype(s1.size()) 更改为 int,代码工作正常。 decltype(s1.size())
我是一名优秀的程序员,十分优秀!