-6
A
回答
1
在链接的评论说:“整数,指针和成员指针模板参数是不是左值”(重点煤矿)。它并不是说名称整型变量不是左值 - 它们是。
如果有浮点模板参数这样的事情,那么它们也不会是左值;但名为浮点变量仍然会。
1
这与使用int作为模板参数是一个右值具体相关,但不能将浮点数用作模板参数。
例如。
template <int T>
struct foo
{
void f(int&);
void f(int&&);
void bar()
{
int x;
f(x); // calls first version
f(T); // calls second version, despite being "named"
}
};
template <float F> // compile error: can't use a float as a template parameter
struct bad {};
1
你是什么意思的“命名值”? C++中没有这样的概念。 变量(不论其类型如何)是一个左值(当在 表达式中使用时)。在大多数情况下,引用类型的东西是 左值,除了数据类型变量以外的东西不是(但我是 肯定有人会发现一些例外);数据类型(整数 或浮点数)与它无关。
有问题的线程正在讨论非类型的模板参数。上面的规则 也适用于此处:引用是左值,其他类型不是左值,其他类型是 。由于只有非常有限的非参考类型集可以用作非类型模板参数,所以似乎会出现混淆:特别是 ,整数类型是可以的,但浮点类型不是。 因此,一个模板内,一个浮点参数必须是参考(和 从而左值),积分类型可以是一个值类型(不是 左值)或基准(左值),例如:
template <int N>
struct A { /* N is not an lvalue */ };
template<int& N>
struct B { /* N is an lvalue */ };
template <double N>
struct C {}; // This is illegal, and shouldn't compile
template <double& N>
struct D { /* N is an lvalue */ };
这里的区别不在于N
是否具有整型,它是 是否N
是一个参考与否。
相关问题
- 1. 重命名路径名为
- 2. 命名:createFunctionDelegate()vs createDelegateFunction()?
- 3. POSIX命名行为
- 4. 是否可以使用一行命令将[int,bool,float]转换为['int','bool','float']?
- 5. 匿名函数vs命名函数哪个更好,为什么
- 6. df.set_index()中的Float vs Int行为
- 7. 将float转换为byte []以通过命名管道(C++)发送
- 8. 命名方法:send_auto_reply()vs send_autoreply()
- 9. 命名参数:C#vs Python
- 10. 命名类像“com.facebook.FacebookClient”vs“com.facebook.Client”
- 11. 如何重命名为命令输出?
- 12. 错误重命名为MANIFEST.MF
- 13. 变量命名为循环
- 14. _vimrc重命名为_vimrc.2014
- 15. ,因为命名空间
- 16. 命令不作为别名
- 17. C++不命名为类型
- 18. 命名指针为“pointerToXYZ”
- 19. InjectionFactory为命名实例
- 20. 为什么命名不同?
- 21. Velocity命名参数为宏
- 22. ImportError:No Module命名为bs4(BeautifulSoup)
- 23. 重命名表为'NOW()+ old_table_name'
- 24. PHP命名为信号量?
- 25. 列命名为数字
- 26. Vue.js命名为javascript钩子
- 27. 将total.js重命名为totaljs
- 28. 为命名管道生成名称
- 29. 没有名为命名空间“STD” make_unique'
- 30. 重命名文件扩展名为.txt