草庐IT

局部剪枝

全部标签

c++ - 作为非类型名参数的局部变量

为什么将局部变量用作非类型参数是非法的?例如,在下一段代码中,local_var不能作为X的参数。templatestructX{};voidf(intlocal_var){Xx;} 最佳答案 因为模板参数必须在编译时求值,编译器直到运行时才知道局部变量的地址(为了绑定(bind)一个对象的引用,编译器需要知道局部变量的地址对象)。请注意,C++11标准在第14.3.2/1段中明确说明了可以提供哪些非类型模板参数:Atemplate-argumentforanon-type,non-templatetemplate-paramete

c++ - C++ 可以在类型自动从函数返回类型推断出的函数中使用局部变量吗?

我的问题:假设我在C++(或C)中定义一个函数。是否有任何类似于C++的auto或decltype的东西,我可以在函数定义中使用它们来声明一个局部变量,该变量的类型是从我函数的返回类型推断出来的定义?例子:C和C++中常见的编码模式是SomeTypefoo(){SomeTypex;//...dosomethingtox...returnx;}我希望推断出第二个SomeType而不是明确地输入它。以下是行不通的,但我希望我能本着这种精神做点什么SomeTypefoo(){decltype(return)x;//对于简单的返回类型,这没什么大不了的,但是当返回类型很复杂时(比如返回类型是一

c++ - 这个局部变量是否隐藏/隐藏了另一个常态或 Visual Studio 中的错误?

我已经大大简化了这个问题,因为在更简单的情况下会出现同样的问题:#includeintheight;intmain(){std::cout似乎是调试器显示错误变量值的问题。变量值是正确的,因为打印变量显示正确的全局高度值0。 最佳答案 你是对的,全局变量height在声明自动变量height之前,不被隐藏在main()的最后声明中.std::cout将使用全局变量height.是的,这让调试器感到困惑。它正在显示localheight的值变量,在调试版本中初始化为0xCCCCCCCC,或-858993460以十进制显示。编译器做了正

c++ - 为什么模板不能采用函数局部类型?

在C++中,可以有一个采用函数本地类型的函数:intmain(){structS{staticvoidM(constS&s){}};Ss;S::M(s);}但不能有一个模板可以:templatevoidFoo(constT&t){}intmain(){structS{}s;Foo(s);//Line5:error:nomatchingfunctionforcallto'Foo(main()::S&)'}14.3.1paragraph2inthec++standard.Atypewithnolinkage[...]shallnotbeusedasatemplate-argumentfor

C++ 局部变量和线程(非 thread_local)

局部数组和线程交互的C++98和C++11内存模型是什么?我不是指的是C++11thread_local关键字,它与全局变量和静态变量有关。相反,我想找出在编译时分配的数组线程的保证行为是什么。我所说的编译时指的是“intarray[100]”,这与使用new[]关键字进行分配不同。我不是指静态变量。例如,假设我有以下结构/类:structxyz{intarray[100];};和以下函数:voidfn(intx){xyzdog;for(inti=0;i从多个线程调用fn()安全吗?看起来C++的内存模型是:所有局部非静态变量和数组都分配在栈上,每个线程都有自己的栈。这是真的吗(即,这

c++ - 如何遍历可变模板参数以创建可变数量的局部变量?

我有许多非常相似但运行时使用不同数量和类型的本地对象的函数:templateT*create1(conststd::vector&names){Aa(names[0]);Bb(names[1]);Cc(names[2]);if(a.valid()&&b.valid()&&c.valid())returnnewT(a,b,c);elsereturnNULL;}templateT*create2(conststd::vector&names){Dd(names[0]);Ee(names[1]);if(d.valid()&&e.valid())returnnewT(d,e);elseretu

c++ - switch 语句中的局部作用域——我们在哪里中断?

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:‘break’statementwhenusingcurlybracesinswitch-case在合并包时我遇到了这个语句switch(a){case1:{stringstr="ais1";cout我的问题是,在案例1中,将break放在范围内还是范围外有关系吗?here他们放在外面。我试过this并没有看到任何区别。对我来说没有区别是有道理的,但我团队的那个拥有PHD的人说他记得可能有区别,但他不记得是什么。

java - 使用类变量与将局部变量发送到函数/方法

什么时候将局部变量作为参数推送到函数/方法而不是使用类变量代替函数/方法变量是一种好的形式。例如,我可以有一个函数:intDoSomething(intvar){if(var==-1)return0;}或者我可以有一个类变量“_var”并在同一个函数中使用它,如下所示:intDoSomething(){if(_var==-1)return0;}我的想法是,如果我们有一个类变量要用在某些函数/方法中,在我上面的示例中称为DoSomething,我应该发送DoSomethingfunction/method类变量作为参数,使函数更容易阅读和测试。什么时候做这两者是好的形式?我知道这是一个有

c++ - 由 lambda 初始化的函数局部静态函数对象,线程安全与否?

下面的函数是线程安全的吗?如果它不是线程安全的,那么使funImpl成为非静态的真的有任何开销吗?还是编译器实际上内联了函数对象函数并完全跳过创建函数对象?intmyfun(std::arrayvalues){staticconstautofunImpl=[&]()->int{intsum=0;for(inti=0;i编辑:我从以下位置编辑了函数签名:intmyfun(conststd::array&values)到:intmyfun(std::arrayvalues)很明显,我不是在问值的线程安全性,而是函数局部静态变量funImpl的线程安全性。 最佳答

c++ - 警告 C4172:返回对绑定(bind)到局部变量的 const std::string 的引用。它有多安全?

我刚刚在工作中构建我们的一个项目,我看到添加了一个新功能:conststd::string&ClassName::MethodName()const{return"";}编译器给出警告:WarningC4172:returningaddressoflocalvariableortemporary我认为编译器是对的。这个函数的安全性如何?请注意,该函数不会返回constchar*,这没有问题,因为字符串文字具有静态存储持续时间。它返回对conststd::string的引用 最佳答案 是的,它不安全。返回局部变量或临时变量的地址并取消