根据这个reddit注释线程,如果在写入之前尝试读取内存,则它是未定义的.我指的是已经成功编写的普通堆内存malloc.
...请注意,这不是严格有效的C:允许编译器/运行时系统使用所谓的陷阱表示来初始化未初始化的内存,这会导致访问时出现未定义的行为.
我觉得很难相信.有标准报价吗?
当然,据我所知,无法保证内存已被清零.这个未初始化的存储器中的值基本上是伪随机的或任意的.但我真的不相信标准会将此称为未定义的行为(从某种意义上说它可能是段错误,或者删除所有文件,或者其他什么).其余的reddit线程在这个问题上没有任何更多的亮点.
当T被double(float)const我得到这个错误,当我尝试使用function<T>.
implicit instantiation of undefined template 'std::function<double (float) const>'
Run Code Online (Sandbox Code Playgroud)
但是什么时候T可以double(float).我试图用它std:: remove_cv<T>::type来删除它const,但这不起作用.是的,我有#include<functional>.
所以我的主要问题是:如何修复此问题并删除,const以便我可以将此函数类型放入std:: function.
我在使用operator()lambdas方法时遇到过这个问题,但我认为这个问题通常是关于任何方法类型的,而不仅仅是对于lambdas
但我的第二个问题是:double(float)const甚至意味着什么?!! 我能够了解
double (ClassName::) (float) const
Run Code Online (Sandbox Code Playgroud)
因为这意味着成员函数无法修改其ClassName对象.当我将此类型放入模板中以删除类类型时,我得到的double(float)const是导致问题的.
template<typename>
struct DropClassType;
template<typename Sig, typename C>
struct DropClassType<Sig (C::*)> {
typedef Sig type_without_class;
};
Run Code Online (Sandbox Code Playgroud)
(clang 3.4.2.来自g ++ - 4.9.1的错误更加神秘,但基本相同)
给定一个行程编码的字符串,比如"A3B1C2D1E1",就地解码字符串.编码字符串的答案是"AAABCCDE".假设编码数组足够大以容纳解码的字符串,即您可以假设数组大小= MAX [length(encodedstirng),length(decodedstring)].
这似乎并不重要,因为仅将A3解码为"AAA"将导致原始字符串的'B'重写.
而且,不能假设解码的字符串总是大于编码的字符串.例如:编码字符串 - 'A1B1',解码字符串为'AB'.有什么想法吗?
并且它将始终是字母数字对,即您不会被要求转换0515为0000055555
我在Glassdoor遇到了这个问题并试图实施它.问题如下 -
考虑一个数字123,数字及其数字(123*1*2*3 = 738)的乘积是738.因此,123是738的种子根.写一个程序接受一个数字并找到所有可能的种子根.例如,如果用户输入4977,则答案应为79和711.
我想到了一个方法:
找到2到9之间的所有数字,用于划分数字.
然后从最大的数字(在步骤1中找到的数字中)开始,找到构成数字的数字,然后打印这些数字的所有排列.
但是,这假定数字不重复,其次它不打印所有数字,如4977,它可以找到79但不会找到711.
有更好的方法吗?
如果我按值传递一个空变量,即使它没有定义,它是否安全且合规?
我在处理代码,重载时遇到了这个问题|,以便打印向量的内容v:
v | print; // prints the vector v
Run Code Online (Sandbox Code Playgroud)
我在这里的代码对我的作品有g++和clang,即使print是extern没有关联的变量,但我不知道如果我推的标准太远.这是针对c ++ 11/c ++ 14,我想这是用c ++ 17解决的inline变量?
首先,我的初始代码.目标是允许v|print打印矢量等内容.我也有更大的目标,与范围相关,但我会在这里关注这个小例子
struct print_tag_t {};
print_tag_t print;
void operator| (std::vector<int> & x, decltype(print) ) {
for(auto elem : x) {
std::cout << elem << '\n';
}
}
int main() {
std::vector<int> v{2,3,5,7};
v | print;
}
Run Code Online (Sandbox Code Playgroud)
如果我将其移动到标题中,我可以将operator|重载设置为inline.但那怎么样print?我发现我extern可以避免关于重复符号的链接器错误
// print.hh …Run Code Online (Sandbox Code Playgroud) 这并不重要.但我很好奇这个警告何时出现.我真正的问题是为什么ostream和ofstream被区别对待.
struct Test {
int y;
Test(int k) : y(k) {}
};
Run Code Online (Sandbox Code Playgroud)
使用这个简单的结构,编译器可以看到一个int可以转换为Test.
因此,我收到此代码的警告:
std :: ofstream& operator<< (std :: ofstream& os, const Test& t)
{
os << t.y;
return os;
}
Run Code Online (Sandbox Code Playgroud)
当它看到os << t.y它不知道我是否想要推送名为ty的int,或者我是否想先将int转换为Test然后再推送它.这看起来很奇怪,你会认为它更喜欢非转换的int重载ofstream& operator<< (ofstream &os, int).
g ++(Ubuntu 4.4.3-4ubuntu5)4.4.3:
template_expl.cpp: In function ‘std::ofstream& operator<<(std::ofstream&, const Test&)’:
template_expl.cpp:15: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion …Run Code Online (Sandbox Code Playgroud) 在 bash 中,这是有效的:
echo -n $'a\nb\nc\n' | while read x; do echo = $x =; done
Run Code Online (Sandbox Code Playgroud)
while循环3次
= a =
= b =
= c =
Run Code Online (Sandbox Code Playgroud)
但想象一下一个没有传统尾随换行符的文本文件。我认为这read应该仍然适用于所有三行,但事实并非如此。我刚刚得到:
echo -n $'a\nb\nc' | while read x; do echo = $x =; done
= a =
= b =
Run Code Online (Sandbox Code Playgroud)
bash 中的内容help read并没有真正澄清。
注意:我不需要解决这个问题,我可以自己找到一些方法来修复它。我很好奇,并且很想提交错误报告 - 我通常会尝试尊重可能没有尾随新行的文件。我在使用 -d 选项读取时遇到了这一点。read -d " "将按空格而不是换行符进行分割,但它会错过最后一个条目,除非它有尾随空格。
(Ubuntu。GNU bash,版本 4.1.5(1)-发布)
(我编辑了这个问题是为了避免干扰.在任何其他问题有意义之前,有一个核心问题需要澄清.对现在的答案似乎不太重要的任何人道歉.)
让我们建立一个具体的例子:
struct Base {
int i;
};
Run Code Online (Sandbox Code Playgroud)
没有虚方法,也没有继承,通常是一个非常愚蠢和简单的对象.因此,它是普通旧数据(POD),它可以回溯到可预测的布局.特别是:
Base b;
&b == reinterpret_cast<B*>&(b.i);
Run Code Online (Sandbox Code Playgroud)
这是根据维基百科(它本身声称参考C++ 03标准):
指向一个POD结构对象,适宜地转换使用重新解释铸造,点到它的初始构件,反之亦然,这意味着有在POD结构的开头没有填充.[8]
现在让我们考虑继承:
struct Derived : public Base {
};
Run Code Online (Sandbox Code Playgroud)
同样,没有虚方法,没有虚继承,也没有多重继承.因此这也是POD.
问题:这个事实(Derived是C++ 11中的POD)是否允许我们这样说:
Derived d;
&d == reinterpret_cast<D*>&(d.i); // true on g++-4.6
Run Code Online (Sandbox Code Playgroud)
如果这是真的,那么以下将是明确定义的:
Base *b = reinterpret_cast<Base*>(malloc(sizeof(Derived)));
free(b); // It will be freeing the same address, so this is OK
Run Code Online (Sandbox Code Playgroud)
我不会在这里问new及delete- 这更容易考虑malloc和free.在这种简单的情况下,我只是对有关派生对象布局的规定感到好奇,并且基类的初始非静态成员位于可预测的位置.
Derived对象应该等效于:
struct Derived { // no inheritance
Base b; // …Run Code Online (Sandbox Code Playgroud) 假设我有这个有向无环图(DAG),其中每个节点(除了底行中的节点除外)有一个有向边到它下面的两个节点:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Run Code Online (Sandbox Code Playgroud)
我需要找到通过此DAG的路径,其中节点权重的总和最大化.您只能从此树中的节点向左或向右对角移动.因此,例如,7,3,8,7,5将在此树中给出最大路径.
输入文件包含以这种方式格式化的DAG
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Run Code Online (Sandbox Code Playgroud)
我的问题是,什么算法最好找到最大路径,以及如何在C++中表示这个树?
节点权重是非负的.
(这里的根本问题是我正在尝试使用decltype或者某些其他类型的演绎可能基于auto涉及lambdas的复杂表达式.我正在尝试找到某种解决方法.我一直在玩http: //pfultz2.github.com/Pythy/ for polymorphic lambdas.如果没有告诉你一个长篇故事,我就无法充分发挥其动力!)
我希望能够decltype([](int){return 3.5L};获得lambda的类型,或者至少返回类型.是的,我知道lambdas有一个独特的类型,我不需要提醒,decltype([](int){return 3.5L};如果在两个不同的行上使用它将提供两种不同的类型.
如果我decltype在lambda上使用,那么我会得到一条错误消息('lambda在未评估的上下文中使用').我知道这似乎是一个合理的错误信息,但我很惊讶C++握着那样的手!允许这样做是有用的,特别是访问lambda的返回类型.这个错误只是过度出错的错误消息的结果,还是真的有一个很好的理由为什么它不能完成?
像这样的表达式在成员函数内部起作用:
template<typename T>
struct X {
void foo() {
static auto l = [](int){return 3.5;};
}
};
Run Code Online (Sandbox Code Playgroud)
但我不允许这样做:
template<typename T>
struct X {
static auto var = [](int){return 3.5;}; // will also fail if I use constexpr here
};
x.cpp:8:47: error: expression ‘#‘lambda_expr’ not supported by
dump_expr#<expression error>’ is not a constant-expression
x.cpp:8:47: error: unable to deduce ‘const auto’ from …Run Code Online (Sandbox Code Playgroud)