我只是在自己的代码中注意到了这种行为,所以这是一个天真的问题:
这个:
struct A
{
int get()
{
return a;
}
int a=1;
};
int main() {}
Run Code Online (Sandbox Code Playgroud)
编译当然很好,虽然当成员数据的声明谎言之后的函数定义.
但后来我不明白为什么这样:
struct A
{
auto get() -> decltype(a)
{
return a;
}
int a=1;
};
Run Code Online (Sandbox Code Playgroud)
不编译(*).我要写这个:
struct A
{
int a=1;
auto get() -> decltype(a)
{
return a;
}
};
Run Code Online (Sandbox Code Playgroud)
有什么语言相关的原因,为什么它不好,或者只是编译器没有实现它?无论类成员的顺序如何,我都希望有相同的行为.
(*)通过Ideone.com使用gcc 6.3进行测试
考虑这两个程序及其尝试的编译.
#include <vector>
int main() {
std::vector<struct Typo> a; // Errors centered around `Typo` being an incomplete type
}
Run Code Online (Sandbox Code Playgroud)
例如,gcc 6.3提供以Typo不完整类型为中心的错误消息,包括
/usr/include/c++/6/bits/stl_vector.h:161:9:错误:无效使用不完整类型'
struct main()::Typo'
#include <vector>
int main() {
std::vector<Typo> b; // Errors centred around `Typo` not being defined
}
Run Code Online (Sandbox Code Playgroud)
例如,gcc 6.3给出了以Typo未定义为中心的错误,包括
prog.cpp:4:14:错误:
‘Typo’未在此范围内声明
两个向量实例化当然都是错误的,但是程序注释中引用的不同诊断消息的基本原理是什么?
这真是一个非常愚蠢的问题,答案可能是一个简单的"不",但我会问,以防万一,因为它会很好.
我可以这样做,行为完全符合要求:
struct A { int x; };
A inc(A a) {
a.x += 1;
return a;
}
inc({ 1 });
Run Code Online (Sandbox Code Playgroud)
事实{ 1 }是一个临时的力量,它不会被重用,因为它已被无效inc()(因为使用移动构造函数 - 请纠正我,如果我错了!).
但是,如果我不记得{ 1 }应该代表的是什么,所以我为它做了一个变量,但是我仍然想强制要求它不能被使用两次(我试图让它就像一个临时的,但命名的):
A a = { 1 };
inc(a);
inc(a);
Run Code Online (Sandbox Code Playgroud)
没有参考类型的变化a将导致编译器抱怨双重使用 - 但移动构造函数已被排除,a因为它不是临时的.
有解决方案吗?
->*如果重载->,显然不能自动工作,并且必须手动重载.
为什么标准容器迭代器不超载->*除了->,迫使使用(*iter).*mem_ptr代替iter->*mem_ptr?
#include <iostream>
#include <vector>
struct S
{
int x;
};
int main()
{
std::vector<S> vec = {{42}};
auto mem_ptr = &S::x;
std::cout << (*vec.begin()).*mem_ptr << '\n'; // This line compiles.
std::cout << vec.begin()->*mem_ptr << '\n'; // This line doesn't compile.
}
Run Code Online (Sandbox Code Playgroud) 我从斯蒂芬普拉塔的"C Primer Plus"一书中学习C语言,结果是:
"完整表达式不是更大表达式的子表达式.完整表达式的示例包括表达式语句中的表达式和用作while循环的测试条件的表达式"
我无法清楚地理解完整表达式的确切定义是什么以及为什么本书认为测试条件是完整表达式.
任何人都可以清楚地解释"完整表达"的含义吗?如何指定表达式是否为完整表达式?
有趣的事实是,我确信我们大多数人都能在时间领域发挥作用 - 有些日期/时间可能看似有效,但实际上并不存在,例如夏令时切换时间凌晨2:30.
在C++(标准或Windows)中是否有办法确定给定的时区规范中给定的日期/时间是否有效?
我写了以下程序:
// Example program
#include <iostream>
#include <string>
#include <exception>
struct A {
A() {
std::cout << "A ctor" << std::endl;
}
~A() {
std::cout << "A dtor" << std::endl;
try {
throw std::exception();
} catch (std::exception &e) {
std::cout << "Internal exception caught" << std::endl;
}
}
};
int main()
{
try {
A a;
throw std::exception();
} catch (std::exception &e) {
std::cout << "External exception caught" << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我预期的输出是:
A ctor
A dtor
Internal exception caught …Run Code Online (Sandbox Code Playgroud) c++ destructor exception-handling visual-studio language-lawyer
C++标准说"=","()","[]"应该是非静态成员函数.
为什么用这种方式指定?为什么我们需要以这种方式定义标准?
是
int main()
{
int a;
int b = (a = 0, a) + (a = 1, a);
}
Run Code Online (Sandbox Code Playgroud)
定义?如果没有, a在每一项中,由于多次a未按,顺序写入 ,程序行为显然是未定义的,但是这是否引入了足够的排序点?