为什么右值引用模板变量能够绑定到左值

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)

Dan*_*ica 6

为什么右值引用模板变量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