cpp*_*cpp 5 c++ templates rvalue-reference c++14
为什么右值引用模板变量b<int>能够绑定到左值a?
#include <iostream>
int a = 3;
template<typename T>
T&& b = a;
int main() {
if(std::is_same_v<decltype(b<int>), int&&>) {
std::cout << "same\n";
} else {
std::cout << "different\n";
}
}
Run Code Online (Sandbox Code Playgroud)
Output: same
Run Code Online (Sandbox Code Playgroud)
为什么右值引用模板变量
b<int>能够绑定到左值a?
这个问题做出了错误的假设。右值引用b<int>无法绑定到a. 通过您的实现,没有错误,因为decltype(b<int>)它本身不会导致 的实例化b<int>。
这是否可以有点不清楚。C++17标准草案的相应引用如下[temp.inst/6]:
除非变量模板特化已被显式实例化或显式特化,否则当使用特化时,变量模板特化将被隐式实例化。
根据此引用,我认为b应该实例化它,因为b<int>已使用(即使在未评估的上下文中)。
然而,在当前草案中,措辞有所不同[temp.inst/7/1]:
除非变量模板特化是声明的特化,否则当在需要变量定义存在的上下文中引用变量模板特化时,或者定义的存在影响程序的语义时,变量模板特化会被隐式实例化。
不管怎样,一旦你确保实例是必需的,你就会得到一个编译错误。
现场演示: https: //godbolt.org/z/Ws5ajxWYM
| 归档时间: |
|
| 查看次数: |
106 次 |
| 最近记录: |