从C#程序关闭计算机的最佳方法是什么?
我发现了一些有效的方法 - 我会在下面发布它们 - 但它们都不是很优雅.我正在寻找更简单和原生的东西.net.
我遇到了一个挑战我对C++ lambdas的新生理解的情况,我把它简化为以下内容:
#include <iostream>
void test()
{
int (*func)();
func =
[]()->int {
std::cerr << "func()" << std::endl;
return 0;
};
int i = 0;
func =
[i]()->int {
std::cerr << "func(): i= " << i << std::endl;
return 0;
};
}
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,我将一个非常简单的lambda分配给一个函数指针,它看起来像我期望的那样工作.我在第二种情况下尝试做的是为lambda提供对值的访问i.我对[i]()->int {代码的理解}是它定义了一个没有参数的无名函数,返回一个int并且,通过C++ 11独角兽的魔力,知道它的当前值i.我希望这个lambda应该可以调用int(*)().
test.cpp: In function ‘void test()’:
test.cpp:14:7: error: cannot convert ‘test()::__lambda1’ to ‘int (*)()’ in assignment
func =
^
Run Code Online (Sandbox Code Playgroud)
似乎gcc 4.8.1和4.8.2不同意我的评估(4.4.1甚至拒绝讨论此事).
这似乎表明第二个lambda的类型与函数指针不是赋值兼容的.我不明白为什么会出现这种情况,因为该表达式应该可以调用为" int(*)() …
下面的代码演示了我无法解释的gcc 4.6.2的行为.第一个函数声明一个类型为vec_t的静态数组,其中vec_t是unsigned char的typedef'd别名.除了vect_t的类型是模板参数之外,第二个函数是相同的.第二个函数无法使用诊断编译"错误:'bitVec'的存储大小不是常量".
#include <limits>
void bitvec_func()
{
const std::size_t nbits = 1e7;
typedef unsigned char vec_t;
const std::size_t WLEN = std::numeric_limits<vec_t>::digits;
const std::size_t VSIZ = nbits/WLEN+1;
static vec_t bitVec[nbits/VSIZ]; // Compiles fine
}
template <typename T>
void bitvec_func()
{
const std::size_t nbits = 1e7;
typedef T vec_t;
const std::size_t WLEN = std::numeric_limits<vec_t>::digits;
const std::size_t VSIZ = nbits/WLEN+1;
static vec_t bitVec[nbits/VSIZ]; // "error: storage size of ‘bitVec’ isn’t constant"
}
void flarf()
{
bitvec_func();
bitvec_func<unsigned char>();
}
Run Code Online (Sandbox Code Playgroud)
在我看来,使用参数<unsigned char>实例化模板应该使编译器生成与第一个函数相同的代码.任何人都可以提供任何洞察力,为什么这似乎不是这样的?
[附录:第二个函数 …
我的理解是,在从标准库对象移动后,该对象处于有效但未定义的状态.但是在a的情况下,unique_ptr它是多么不确定?根据经验,下面的代码似乎有效,也就是说,在我离开后p1," if ( p1 )"评估为false.直觉上,这似乎是正确的行为.但我可以依靠这个吗?
#include <memory>
#include <iostream>
int main( int argc, char* argv[] )
{
using namespace std;
unique_ptr<int> p1 {make_unique<int>(1)};
unique_ptr<int> p2;
if ( p1 )
cout << "p1 owns an object" << endl;
if ( p2 )
cout << "p2 owns an object" << endl;
p2 = move(p1);
// Is the following test valid, now that p1 has been moved from?
if ( p1 )
cout << "p1 owns an object" …Run Code Online (Sandbox Code Playgroud)