gpt4 book ai didi

c++ - 当我们在 C++ 中使用像模板这样的变量时,这意味着什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:21:44 25 4
gpt4 key购买 nike

我正在阅读一本 C++ 书籍。我遇到了类似下面的代码:

int foo=3;
if(foo<1>(3))
cout<<"hello world!"<<endl;

那么,int foo 是如何被用作模板的呢?什么意思?

我相信:这是 C++ 的一个巨大歧义,因为如果我们有这样的模板代码,会发生什么? C++ 如何处理这种歧义

template <int N>
void foo( const int t )
{
// ....
}

最佳答案

这绝对是奇怪的代码,所以如果这本书没有解释它,烧掉这本书并要求退款。总结是:它不是模板。这是小于比较,大于比较。

if(foo<1>(3))

等同于

if( (foo<1) >3)

这几乎与

相同
bool first = (foo < 1);  //false since `foo` is 3
bool second = (first > 3); //false evaluates to zero, so this is false as well
if (second) //this is never entered
cout<<"hello world!"<<endl; //compiler probably doesn't even generate this.


至于您关于模板歧义的问题,该语言在某处清楚地指定了默认值,尽管它通常不是您想要的。我编译了你的样本,发现它发出了这个: warning: comparisons like 'X<=Y<=Z' do not have their mathematical meaning [-Wparentheses] http://coliru.stacked-crooked.com/a/49479996464507dc .所以我们知道它仍然被解释为运算符并忽略了这种情况下的模板。

但是,是的,C++ 在这些方面有很多地方是“模棱两可的”。最常见的是“最令人烦恼的解析”。

struct A {};
struct B {
B(A a) {}
};
int main() {
B obj(A());

您希望这会创建一个 B名为 obj使用默认构造的 A , 但它声明了一个名为 obj 的函数返回 B它的参数本身是一个不接受任何参数并返回 A 的函数.然后,当您尝试将其用作变量时,您会遇到各种奇怪且令人困惑的错误:http://coliru.stacked-crooked.com/a/c6fd627be8529b26

一个更阴险的版本是这样的:

template <class T>
struct A {
static int v;
};
template<>
struct A<int>
using v = float;
};
template<class T>
struct B {
B() {
A<T>::v;
}
};

内部B , 很难甚至不可能判断 v是类型或变量。这个太糟糕了,C++ 不得不添加一个特殊的关键字 typename这样程序员就可以告诉编译器它实际上是一种类型,因为编译器总是会假定它是一个变量。

关于c++ - 当我们在 C++ 中使用像模板这样的变量时,这意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29855735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com