我明白这int x{};是一种默认初始化,但它和写作完全一样int x = 0;吗?
我最近偶然发现了一些奇怪的事情:将一个布尔值转换为指针在Visual Studio 2013和2015中有效但在GCC和Clang上都没有(在3.5中尝试过).
#include <iostream>
using namespace std;
void foo(int *ptr)
{
std::cout << "foo";
}
int main()
{
foo(false);
}
Run Code Online (Sandbox Code Playgroud)
GCC出错:
main.cpp: In function 'int main()':
main.cpp:13:13: error: cannot convert 'bool' to 'int*' for argument '1' to 'void foo(int*)'
foo(false);
^
Run Code Online (Sandbox Code Playgroud)
我的猜测是将false转换为0,相当于NULL.更换调用foo的与foo(true)原因编译失败,每一个编译器.
所以我的问题是:这段代码应该编译吗?我没有看到将false转换为指针的好处,在我看来,它只会是误用/重构等错误的原因
在C++中,当一个应该返回一个对象的函数在没有return语句的情况下结束时会发生什么?什么回来了?
例如
std::string func() {}
Run Code Online (Sandbox Code Playgroud) 我今天注意到在示例代码中:
void print(unsigned short a) {
std::cout << a << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
初始化和使用的工作方式如下:
print(short (5));
Run Code Online (Sandbox Code Playgroud)
但不是这样的:
print(unsigned short(6));
Run Code Online (Sandbox Code Playgroud)
main.cpp:16:8:错误:在'unsigned'打印之前预期的primary-expression(unsigned short(6));
并且它与该类型无关,因为这也有效:
typedef unsigned short ushort;
print(ushort (6));
Run Code Online (Sandbox Code Playgroud)
所以我去搜索标准关于值初始化的内容.事实证明:
值初始化的效果是:
1)如果T是类型...
2)如果T是非联盟类型......
2)如果T是类型...
3)如果T是数组类型,..
4)否则,对象是零初始化的.
为便于阅读而进行的修改. 原始来源.
有关POD类型值初始化的规则是什么?unsigned合格类型无法初始化的原因是什么?这更多地与他们的事实有关rvalues吗?
在对不可复制变量(例如std::atomic<int>)执行成员初始化时,需要使用direct-initialization而不是copy-initialization根据此处的答案。然而,当我打开-std=c++17的g++ 7.4.0,似乎后者也是行之有效的。
#include <atomic>
class A {
std::atomic<int> a = 0; // copy-initialization
std::atomic<int> b{0}; // direct-initialization
};
Run Code Online (Sandbox Code Playgroud)
$ g++ -c atomic.cc -std=c++11 // or c++14
atomic.cc:4:26: error: use of deleted function ‘std::atomic<int>::atomic(const std::atomic<int>&)’
std::atomic<int> a = 0; // copy-initialization
$ g++ -c atomic.cc -std=c++17
// no error
Run Code Online (Sandbox Code Playgroud)
与编译时,它也没有g++ 6.5.0,甚至有-std=c++17。这里哪一个是正确的?
我试图理解 C++ 中的生命周期延长保证。有人可以解释为什么下面不同类型括号的使用在调用临时对象析构函数时会产生不同的结果吗?
#include <iostream>
struct X {
X() {
std::cout << __PRETTY_FUNCTION__ <<"\n";
}
~X() {
std::cout << __PRETTY_FUNCTION__ <<"\n";
}
};
struct Y {
X &&y;
};
int main() {
Y y1(X{});
std::cout << "Here1\n";
Y y2{X{}};
std::cout << "Here2\n";
}
Run Code Online (Sandbox Code Playgroud)
输出
X::X()
X::~X()
Here1
X::X()
Here2
X::~X()
Run Code Online (Sandbox Code Playgroud) 我正在努力理解rvalue参考文献.我看到他们是如何在构造函数中使用,之类的东西std::move和std::forward,但我还是不明白为什么这不起作用:
void func(string&& str)
{
cout << str << endl;
}
int main(int argc, char* argv[])
{
string s("string");
func(s);
}
Run Code Online (Sandbox Code Playgroud)
这样做:
template<typename T>
void func(T&& str)
{
cout << str << endl;
}
int main(int argc, char* argv[])
{
string s("string");
func(s);
}
Run Code Online (Sandbox Code Playgroud)
为什么它与函数模板版本一起使用?
我写了一个测试程序:
#include <iostream>
#include <type_traits>
using namespace std;
template<class T>
void f(T&& t)
{
cout<<is_const<T>()<<endl;
//++t;
}
int main() {
const int i=0;
f(i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它输出"0",显示T不是常量!这很奇怪.然后我修改了f:
template<class T>
void f(T&& t)
{
cout<<is_const<T>()<<endl;
++t;
}
Run Code Online (Sandbox Code Playgroud)
然后是编译器错误,说我们正在修改只读t.那么t可修改与否?在我的计划中有任何错误的假设吗?
#include<cstddef>
template<typename T, std::size_t N>
struct A {
T m_a[N];
A() : m_a{} {}
};
struct S {
explicit S(int i=4) {}
};
int main() {
A<S, 3> an;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码与MSVC(2017)编译良好,但与clang 3.8.0(输出clang++ --version && clang++ -std=c++14 -Wall -pedantic main.cpp)失败:
clang version 3.8.0 (tags/RELEASE_380/final 263969)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin
main.cpp:6:15: error: chosen constructor is explicit in copy-initialization
A() : m_a{} {}
^
main.cpp:14:13: note: in instantiation of member function 'A<S, 3>::A' requested here
A<S, 3> an; …Run Code Online (Sandbox Code Playgroud) 该bool数据类型通常表示为0(如false)和1(如true)。但是,有人说true值可以用以外的值表示1。如果后面的语句是true,则以下表达式可能不正确。
bool x = 1;
if (x==1)
Do something..
Run Code Online (Sandbox Code Playgroud)
我想知道以下语句是否可以在常用的编译器上按期望和预期的方式工作。
bool x = 1;
if (x==1)
Do something.
Run Code Online (Sandbox Code Playgroud)
bool y = 0;
if (y>0.5)
Do something..
Run Code Online (Sandbox Code Playgroud)
bool z = 1;
if(z>0.5)
Do something...
Run Code Online (Sandbox Code Playgroud)