Coderbyte是一个在线编码挑战网站(我在2分钟前找到了它)。
您遇到的第一个C ++挑战有一个您需要修改的C ++框架:
Run Code Online (Sandbox Code Playgroud)#include <iostream> #include <string> using namespace std; int FirstFactorial(int num) { // Code goes here return num; } int main() { // Keep this function call here cout << FirstFactorial(gets(stdin)); return 0; }
如果你稍微熟悉C ++的第一件事*在你的眼睛持久性有机污染物是:
int FirstFactorial(int num);
cout << FirstFactorial(gets(stdin));
Run Code Online (Sandbox Code Playgroud)
因此,好的,代码调用gets从C ++ 11开始不推荐使用,而从C ++ 14开始删除,这本身就是不好的。
但后来我意识到:gets是类型char*(char*)。因此,它不应该接受FILE*参数,并且结果不能代替int参数使用,但是...不仅可以编译时没有任何警告或错误,而且可以运行并将实际的正确输入值传递给FirstFactorial。
在此特定站点之外,代码无法编译(如预期的那样),那么这里发生了什么?
*实际上第一个是,using namespace std但这与我在这里的问题无关。
我已经习惯了,std::tie没有多考虑它.它有效,所以我接受了:
auto test()
{
int a, b;
std::tie(a, b) = std::make_tuple(2, 3);
// a is now 2, b is now 3
return a + b; // 5
}
Run Code Online (Sandbox Code Playgroud)
但这个黑魔法是如何运作的呢?如何做一个临时的创建std::tie改变a和b?我发现这更有趣,因为它是一个库功能,而不是语言功能,所以我们可以自己实现并理解它.
有一个旧帖子要求一个sizeof可以返回的构造0.高信誉用户有一些高分答案说,按标准,没有类型或变量可以有0的大小.我同意100%.
然而,这个新的答案提出了这个解决方案:
struct ZeroMemory {
int *a[0];
};
Run Code Online (Sandbox Code Playgroud)
我正要进行投票和评论,但是在这里度过的时间教会我检查我100%肯定的事情.所以...让我惊讶的是,gcc并clang显示出相同的结果:sizeof(ZeroMemory) == 0.更重要的是,变量的大小是0:
ZeroMemory z{};
static_assert(sizeof(z) == 0); // Awkward...
Run Code Online (Sandbox Code Playgroud)
Whaaaat ...?
这怎么可能?
今天我用一些C代码帮助我的一个朋友,我发现了一些奇怪的行为,我无法解释他为什么会发生这种行为.我们有一个带有整数列表的TSV文件,每行都有一个int.第一行是列表的行数.
我们还有一个非常简单的"readfile"的ac文件.第一行读到n,行数,然后有一个初始化:
int list[n]
Run Code Online (Sandbox Code Playgroud)
最后是一个带有fscanf的n循环.
对于小n(直到~100,000),一切都很好.但是,我们发现当n很大(10 ^ 6)时,会发生段错误.
最后,我们将列表初始化更改为
int *list = malloc(n*sizeof(int))
Run Code Online (Sandbox Code Playgroud)
一切都很好,即使是非常大的n.
有人能解释为什么会这样吗?什么导致了segfault [n]的段错误,当我们开始使用list = malloc(n*sizeof(int))时停止了?
我认为,因为C++ 11用户定义的类型对象应该使用新{...}语法而不是旧(...)语法构造(除了构造函数重载std::initializer_list和类似参数(例如std::vector:size ctor vs 1 elem init_list ctor)).
好处是:没有狭义的隐式转换,最烦人的解析没有问题,一致性(?).我没有看到任何问题,因为我认为它们是相同的(除了给出的例子).
但他们不是.
该{}调用默认的构造函数.
......除非:
然后它看起来像是值而不是初始化对象?...即使对象已经删除了默认构造函数,{}也可以创建一个对象.这不是打败了删除的构造函数的全部目的吗?
......除非:
然后失败了call to deleted constructor.
......除非:
然后失败并丢失了字段初始值设定项.
但是,您可以使用它{value}来构造对象.
好吧也许这与第一个异常相同(值init对象)
......除非:
然后也{}不能{value}创建一个对象.
我相信我错过了一些.具有讽刺意味的是,它被称为统一初始化语法.我再说一遍:UNIFORM初始化语法.
这种疯狂是什么?
struct foo {
foo() = delete;
};
// All bellow OK (no errors, no warnings) …Run Code Online (Sandbox Code Playgroud) c++ language-lawyer aggregate-initialization list-initialization c++14
我们可以将可变参数模板参数限制为某种类型吗?即,实现类似的东西(当然不是真正的C++):
struct X {};
auto foo(X... args)
Run Code Online (Sandbox Code Playgroud)
在这里,我的目的是拥有一个接受可变数量X参数的函数.
我们最接近的是:
template <class... Args>
auto foo(Args... args)
Run Code Online (Sandbox Code Playgroud)
但是这接受任何类型的参数.
似乎只能在别名模板的pack参数的位置扩展pack参数.对于类或函数模板,情况并非如此:
template <class T, class... Args> struct x { using type = T; };
template <class T, class... Args> using x_t = typename x<T, Args...>::type;
template <class... Args> using x_fix_t = typename x<Args...>::type;
template <class... Args> auto f(Args...) -> void {
typename x<Args...>::type v1; // OK
x_t<Args...> v2; // Error
x_fix_t<Args...> v3; // OK
}
Run Code Online (Sandbox Code Playgroud)
更简单的情况:
template <class T, class U> using y_t = T;
template <class... Args> auto f(Args...) -> void {
y_t<Args...> v4; // Error
} …Run Code Online (Sandbox Code Playgroud) c++ language-lawyer variadic-templates c++11 template-aliases
如果我得到一个bool变量并将其第二位设置为1,则变量同时评估为true和false。使用带有-g选项(gcc-v6.3.0/Linux/RHEL6.0-2016-x86_64/bin/g++ -g main.cpp -o mytest_d)的gcc6.3编译以下代码,然后运行可执行文件。您得到以下内容。
T如何同时等于真和假?
value bits
----- ----
T: 1 0001
after bit change
T: 3 0011
T is true
T is false
Run Code Online (Sandbox Code Playgroud)
当您使用不同的语言(例如fortran)调用函数时,可能会发生这种情况,其中对和错的定义与C ++不同。对于fortran,如果任何位都不为0,则该值为true;如果所有位为零,则该值为false。
#include <iostream>
#include <bitset>
using namespace std;
void set_bits_to_1(void* val){
char *x = static_cast<char *>(val);
for (int i = 0; i<2; i++ ){
*x |= (1UL << i);
}
}
int main(int argc,char *argv[])
{
bool T = 3;
cout <<" value bits " <<endl;
cout <<" …Run Code Online (Sandbox Code Playgroud) 我使用GCC 4.9.2得到了"内部编译器错误":
#include <type_traits>
template <typename T, typename, int, template <typename U, U, U> class>
struct Sort;
template <typename T, template <T...> class Z, T N, T... Is,
template <typename U, U, U> class Comparator>
struct Sort<T, Z<N, Is...>, 0, Comparator> {
template <T I>
struct less_than : std::integral_constant<bool, Comparator<T, I, N>::value> {
};
};
int main() {}
Run Code Online (Sandbox Code Playgroud)
错误消息指出:
c:\ ADandD> g ++ -std = c ++ 14 ComparatorAndSorterTGeneralized.cpp ComparatorAndSorterTGeneralized.cpp:254:80:内部编译器错误:在tsubst中,在cp/pt.c:11738
Run Code Online (Sandbox Code Playgroud)template<T I> struct less_than : std::integral_constant<bool, Comparator<T,I,N>::value> {}; ^如果合适,请提交完整的错误报告,并提供预处理的来源.有关说明,请参阅 …