C++ 制作';常数';与类型特征的结果一起工作 intmain(intargc,char*argv[]){ 常数i=10; 使用Type=typename std::conditional::Type; const Type r=i;//这个“const”似乎没有任何效果。 std::cout

C++ 制作';常数';与类型特征的结果一起工作 intmain(intargc,char*argv[]){ 常数i=10; 使用Type=typename std::conditional::Type; const Type r=i;//这个“const”似乎没有任何效果。 std::cout,c++,c++11,std,typetraits,C++,C++11,Std,Typetraits,在第一个示例中,const无效,因为它绑定到了错误的类型:在引用之后,而不是之前。有关可能有帮助的一些详细信息,请参阅,但基本上: int main(int argc, char* argv[]) { const int i = 10; using Type = typename std::conditional<false, const int, const int&>::type; Type r = i; std::cout << r <

在第一个示例中,
const
无效,因为它绑定到了错误的类型:在引用之后,而不是之前。有关可能有帮助的一些详细信息,请参阅,但基本上:

int main(int argc, char* argv[]) {
  const int i = 10;
  using Type = typename std::conditional<false, const int, const int&>::type;
  Type r = i;
  std::cout << r << std::endl;
}
当然,所有引用都是不可变的(无法重置),所以最后一个引用有点无用。之所以会出现这种情况,是因为在引用应用于类型之后应用了
const
,这就给出了我编写的第三个示例,而不是第一个或第二个示例。

您也可以更改

const int& // reference to immutable int
int const& // reference to immutable int
int& const // immutable reference to int

让它工作

当你说

  int i = 10;
typedef int& Type;
当你说

  int i = 10;
typedef int& Type;
你说的是

const Type r = i;
这和我的想法不一样

int& const r = i;

John Zwinck在他的回答中解释了它们之间的差异。

(尽管这样键入
int&const
是无效的。只有当
const
应用于恰好是引用类型的typedef或模板参数时,才允许这样做。)
int& const r = i;
const int& r = i;