- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
任何人都可以帮助我解释为什么论证推导没有像我预期的那样工作吗?请查看我的代码注释以了解我的思路?
#include <iostream>
#include <type_traits>
#include <iomanip>
#include <string>
using namespace std;
template<class T>
void deduce1(T args, string arg){
cout << "template<class T> void deduce1(T args) " << " argument passed in was: " << arg << " deduced as: " << typeid(T).name() << endl;
cout << "Is const: " << boolalpha << is_const<T>::value << endl;
cout << "Is reference: " << boolalpha << is_reference<T>::value << endl;
cout << "Is pointer: " << boolalpha << is_pointer<T>::value << endl;
}
template<class T>
void deduce2(T& args,string arg){
cout << "template<class T> void deduce2(T args) " << " argument passed in was: " << arg << " deduced as: " << typeid(T).name() << endl;
cout << "Is const: " << boolalpha << is_const<T>::value << endl;
cout << "Is reference: " << boolalpha << is_reference<T>::value << endl;
cout << "Is pointer: " << boolalpha << is_pointer<T>::value << endl;
}
template<class T>
void deduce3(T&& args,string arg){
cout << "template<class T> void deduce3(T args) " << " argument passed in was: " << arg << " deduced as: " << typeid(T).name() << endl;
cout << "Is const: " << boolalpha << is_const<T>::value << endl;
cout << "Is reference: " << boolalpha << is_reference<T>::value << endl;
cout << "Is rvalue reference: " << boolalpha << is_rvalue_reference<T>::value << endl;
cout << "Is pointer: " << boolalpha << is_pointer<T>::value << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a = 1;
const int b = 5;
int c[] = {12};
int const d[] = {12};
int& e = a;
deduce1(a,"int a = 1");
deduce1(b,"const int b = 5");
deduce1(c,"int c[] = {12}");
deduce1(d,"int const d[] = {12}"); // would have thought is_const<T> would return true any comments?
deduce1(e,"int& e = a");
deduce1(5,"5");
deduce2(a,"int a = 1");
deduce2(b,"const int b = 5"); //would have though type would be deduced as int const comments?
deduce2(c,"int c[] = {12}"); // why is this not returning true as a reference?
deduce2(d,"int const d[] = {12}"); // would have thought is_const<T> would return true any comments
deduce2(e,"int& e = a");
deduce3(a,"int a = 1");
deduce3(b,"const int b = 5");
deduce3(c,"int c[] = {12}"); // why is this not returning true as a reference?
deduce3(d,"int const d[] = {12}"); // would have thought is_const<T> would return true any comments
deduce3(e,"int& e = a");
deduce3(string("Hello"),"string(\"Hello\")"); // why not rvalue reference
return 0;
}
最佳答案
我会依次处理您的每条评论。
deduce1
和 d
:
template <class T> void deduce1(T args, string arg);
int const d[] = {12};
deduce1(d, "int const d[] = {12}"); // would have thought is_const<T> would return true
首先重要的是,在 C++ 中,您不能按值将数组作为参数传递。表示数组的表达式几乎会立即衰减为指向其第一个元素的指针。所以此处为 T
推导的类型将是 int const *
。
那么,为什么这行不通呢?问题是指针 不是const
。指针指向的 int
是 const
。如果您想报告所指向类型的 const
ness,您需要在检查 const
ness 之前使用 remove_pointer
。因此,您可以将 const
检查更改为:
cout << "Is const: " << boolalpha << is_const<typename remove_pointer<T>::type>::value << endl;
但是,它之前给出的结果是正确答案。指针确实不是 const
。事实上,即使指针是 const
,顶层 const
也会在类型推导完成之前被剥离,所以 T
不会是 const
无论如何。这样做的原因是,如果你按值传递,你真的不关心参数的 const
ness,因为你无论如何都要复制它。
deduce2
和 b
:
template <class T> void deduce2(T& args,string arg);
const int b = 5;
deduce2(b,"const int b = 5"); //would have though type would be deduced as int const
不确定这里发生了什么,但我的输出是:
deduced as: i
Is const: true
Is reference: false
Is pointer: false
完全符合预期。
deduce2
与 c
:
int c[] = {12};
deduce2(c,"int c[] = {12}"); // why is this not returning true as a reference?
这是说它不是引用,原因与所有 deduce2
调用都这么说一样(并且您在整个 deduce3
中也有这个问题)。在您的函数中,您正在检查 T
的类型,但 args
的类型是 T&
。您只检查 &
之前的部分。所以在这里,args
的类型是 int (&)[1] c
但您只是检查 int [1]
是否是引用。通过在检查中使用 decltype(args)
而不是 T
来修复它。
deduce2
和 d
:
int const d[] = {12};
deduce2(d,"int const d[] = {12}"); // would have thought is_const<T> would return true
与 deduce1
相同的问题与 d
(第 1 项)。
deduce3
和 c
:
template <class T> void deduce3(T&& args,string arg);
int c[] = {12};
deduce3(c,"int c[] = {12}"); // why is this not returning true as a reference?
与 deduce2
使用 c
(第 3 项)的问题相同。
deduce3
和 d
:
int const d[] = {12};
deduce3(d,"int const d[] = {12}"); // would have thought is_const<T> would return true
与 deduce1
相同的问题与 d
(第 1 项)。
使用
:string("Hello")
推导3
deduce3(string("Hello"),"string(\"Hello\")"); // why not rvalue reference
我假设您对“通用引用”有所了解。斯科特迈耶斯有一个伟大的article和 talk关于这个问题。
在这种情况下,因为 string("Hello")
是一个右值表达式,类型 T
被推断为 string
(由T&&
形式的推导右值引用类型的规则)。 args
的类型现在是 string &&
。因此,如果您检查 decltype(args)
是否为右值,它会说 true。但是 T
本身不是。
如果您修复代码,使 T
上的所有类型特征现在都在 decltype(args)
上,您将遇到新问题。当 args 是引用类型时,您期望为 const
的某些类型将不会。那是因为没有 const
引用这样的东西。与在项目 1 中使用 remove_pointer
类似,您需要使用 remove_reference
获取基础类型并检查它是否为 const
。
关于C++模板参数推导过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13265842/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!