最近的一个问题(特别是我对它的回答)让我想知道:
在C++ 11(和更新的标准)中noexcept,除非另有说明(即noexcept(false)),否则析构函数总是隐式的.在这种情况下,这些析构函数可能合法地抛出异常.(请注意,这仍然是你应该知道你在做什么 - 情况!)
但是,所有重载
std::unique_ptr<T>::reset()都被声明为noexcept(参见cppreference),即使析构函数T不是,如果析构函数在此期间抛出异常,也会导致程序终止reset().类似的事情适用于std::shared_ptr<T>::reset().
为什么reset()总是noexcept,而不是条件noexcept?
noexcept(noexcept(std::declval<T>().~T()))如果析构函数T是noexcept ,应该可以声明它使得它完全没有.我在这里遗漏了什么,或者这是标准中的疏忽(因为这无疑是一个高度学术化的情况)?
using ::std::...;
Run Code Online (Sandbox Code Playgroud)
VS
using std::...;
Run Code Online (Sandbox Code Playgroud)
有差异吗?如果是的话,哪一个?
我看到了这个:
using ::std::nullptr_t;
Run Code Online (Sandbox Code Playgroud)
这让我很好奇.
我最近惊讶于lambdas可以被分配给std::function具有略微不同签名的s .略有不同意味着当function指定返回时void,lambda的返回值可能会被忽略,或者参数可能是functionlambda 中的值但是引用.
请参阅此示例(ideone),其中我强调了我怀疑不兼容的内容.我认为返回值不是问题,因为你总是可以调用一个函数并忽略返回值,但是从引用到值的转换看起来很奇怪:
int main() {
function<void(const int& i)> f;
// ^^^^ ^^^^^ ^
f = [](int i) -> int { cout<<i<<endl; return i; };
// ^^^ ^^^^^^
f(2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
小问题是:为什么这段代码编译和工作?主要问题是:与lambda参数和返回值一起使用时,类型转换的一般规则是什么std::function?
我试图给出一个导致rvalue的操作的简单示例.
这个测试用例应该有效,但令人惊讶的是(对我而言),添加两个ints 的结果不是rvalue(引用).我在这里错过了什么?
void test(int i, int j)
{
// this assert should pass, but fails:
static_assert(std::is_same<decltype(i + j), int&&>(), "i + j should be a rvalue");
// this assert passed, but should fail:
static_assert(std::is_same<decltype(i + j), int>(), "this assert should fail...");
}
Run Code Online (Sandbox Code Playgroud) 我试图创建一个函数,返回我将传递给它的整数的两倍.我的代码收到以下错误消息:
'int x'的声明会影响参数int x; "
这是我的代码:
#include <iostream>
int doublenumber();
using namespace std;
int doublenumber(int x)// <-- this is the function which returns double the value .
{
int x;
return 2 * x;
cout << endl;
}
int main()
{
int a;
cout << "Enter the number that you want to double it : " << endl;
cin >> a;
doublenumber(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试停止QML视频,并在播放完成后显示其最后一帧.有人知道怎么做这个吗?(对不起,这似乎并不像听起来那么微不足道......)
目前,我的问题是视频元素在播放完成后变得不可见/隐藏.(onVisibleChanged从未被称为.)
当我onStatusChanged在我的代码中使用hack时,视频会在结束后消失一段时间,然后显示视频结束.
我正在做的只是:
Video {
anchors.fill: parent
fillMode: VideoOutput.PreserveAspectFit;
source: "path/to/file"
autoPlay: true
onStatusChanged: {
console.warn("StatusChanged:"+status+"|"+MediaPlayer.Loaded)
if (status == MediaPlayer.EndOfMedia)
{
// seek a bit before the end of the video since the last frames
// are the same here, anyway
seek(metaData.duration-200)
play()
pause()
}
}
onVisibleChanged:
{
console.log(visible)
}
}
Run Code Online (Sandbox Code Playgroud)
我可能遗漏了一些东西,但我在文档中找不到关于这个主题的任何内容.另外,使用单独MediaPlayer并且VideoOutput不会改变行为.
为了记录,我在Windows上使用最新的Qt 5.2(msvc2010 + OpenGL-build).
该站点介绍了C ++ 11原子fetch_mult,并提供了默认std::atomic<T>类型未提供的原子操作的示例实现:
#include <atomic>
#include <iostream>
template <typename T>
T fetch_mult(std::atomic<T>& shared, T mult){
T oldValue= shared.load();
// 1
while (!shared.compare_exchange_strong(oldValue, oldValue * mult));
return oldValue;
}
int main(){
std::atomic<int> myInt{5};
std::cout << myInt << std::endl;
fetch_mult(myInt,5);
std::cout << myInt << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我在理解此功能时遇到麻烦。如果fetch_mult在点中断// 1另一个线程还呼吁fetch_mult,也不会一个线程死锁,因为compare_exchange_strong永远不会返回true,除非任何mult==1或者另一个线程组值回oldValue?
例如(T1和T2是各自的线程):
oldValue = 5;oldValue = 5;compare_exchange_strong成功将值设置为25compare_exchange_strong …从 C++98 和 C++11 过渡的早期开始,我记得在将 C++98 库和 C++11 库链接在一起时出现了一些与 ABI 相关的问题。(参见例如将不同的 C++ 标准与 GCC 混合以及该问题的答案。)
我有一个特殊的情况,我的代码的一部分需要使用仅支持 C++11 的工具进行编译,而另一部分使用 C++14 特性并且可以使用支持它们的标准 g++ 进行编译。我可以将代码的每一部分放入自己的库中并链接它们。但我想知道:一般来说,C++11 和 C++14 之间是否存在会导致(例如 ABI 相关)问题的差异?
在C++ 11中,您可以从基类继承所有构造函数.构造函数继承如何针对默认参数进行操作?
请考虑以下代码:
struct Base
{
Base(int x, int y=0, int z=0)
{
}
};
struct Derived : public Base
{
using Base::Base;
};
int main() {
Base B(1,2);
Derived D(2,2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这不能在MSVC13上编译,并出现以下错误:
..\constructor_test\main.cpp(16) : error C2660: 'Derived::Derived' : function does not take 2 arguments
Run Code Online (Sandbox Code Playgroud)
但是,它在GCC上运行正常(请参阅http://ideone.com/nNmXHo).所以我的问题是:
不应该生成一个,两个和三个参数的构造函数吗?哪个编译器在这里正确?MSVC13或GCC?如果GCC是正确的,MSVC是否有任何已知的解决方法(除了再次明确指定构造函数)?
因此,让我们考虑以下语句在循环内执行超过一百万次.
boolean validity = condition1 || condition2;
Run Code Online (Sandbox Code Playgroud)
可以安全地假设condition1和condition2都有非常复杂的计算.所以既然这里有一个OR运算符,我认为首先分别检查condition1然后如果需要,条件2之后是明智的,比如,
boolean validity = condition1;
if( !validity )
validity = condition2;
Run Code Online (Sandbox Code Playgroud)
我应该手动执行这样的优化还是java编译器会自动处理这些事情?
如果我有一个我知道的长度恒定的字符串,我应该使用什么?
char test[100]
std::array<char, 100> test
std::string test
Run Code Online (Sandbox Code Playgroud)
谢谢!
c++ ×9
c++11 ×6
atomicity ×1
c++14 ×1
decltype ×1
destructor ×1
function ×1
g++ ×1
integer ×1
java ×1
lambda ×1
lock-free ×1
namespaces ×1
noexcept ×1
optimization ×1
performance ×1
qml ×1
qt ×1
qt5 ×1
rvalue ×1
scope ×1
stdatomic ×1
using ×1
video ×1
visual-c++ ×1