考虑以下MCVE.
#include <type_traits>
struct A {
template<typename T, typename std::enable_if<std::is_same<T,int>::value,int>::type = 0>
operator T() const { return static_cast<T>(1); }
};
int main() {
int x = 1;
A a;
return x + a;
}
Run Code Online (Sandbox Code Playgroud)
clang汇编得很好.DEMO
但海湾合作委员会失败了:
error: no match for 'operator+' (operand types are 'int' and 'A')
return x + a;
~~^~~
Run Code Online (Sandbox Code Playgroud)
问题:谁是对的?为什么?
在 C++20 (N4849) 中,关联容器extract()和insert(node_handle)/insert(hint, node_handle)方法没有异常安全措辞。
但是对于merge(),虽然有这样的措辞:
抛出:除非比较对象抛出,否则什么都没有。
位置:
22.2.6 关联容器 [associative.reqmts]
表 78:关联容器要求(除了容器)[tab:container.assoc.req]
第 799 页
显然,最初的提案 ( P0083R3 ) 旨在使其无投掷(第 5 页):
异常安全
如果容器的 Compare 函数是 no-throw(这是很常见的),那么移除、修改和插入节点都是 no-throw,除非修改值会抛出。如果修改值确实抛出,它会在所涉及的容器之外进行。
但为什么在该提案后面的拟议措辞中没有发言权?
在Jersey中有一个@BeanParam注释,我可以将请求参数映射到bean属性.
在Spring中,我只能找到@RequestBody哪个显然适用于请求体而不是请求参数.
有没有办法让请求参数使用Spring映射到bean?
我的系统正在遭受高计时器分辨率(NtQueryTimerResolution返回0.5ms).
Maximum timer interval: 15.600 ms
Minimum timer interval: 0.500 ms
Current timer interval: 0.500 ms
Run Code Online (Sandbox Code Playgroud)
某些进程必须使用NtSetTimerResolution5000(0.5ms)的值调用,但如何确定哪一个?我看到英特尔有一个名为电池寿命分析器的工具,它显示每个进程的当前计时器分辨率,但该工具仅供英特尔合作伙伴使用.是否有其他工具或通过WinDbg查看它的方法?注意:似乎在启动时发生,因为设置断点不起作用(调试器启动时分辨率已经很高).
尝试在Visual C++ 2015中编译时
auto worker = std::bind(&boost::asio::io_service::run, &(this->service));
Run Code Online (Sandbox Code Playgroud)
我收到错误:
error C2783: 'std::_Binder<_Ret,_Fx,_Types...> std::bind(_Fx &&,_Types &&...)': could not deduce template argument for '_Ret'
note: see declaration of 'std::bind'
error C2783: 'std::_Binder<_Ret,_Fx,_Types...> std::bind(_Fx &&,_Types &&...)': could not deduce template argument for '_Fx'
note: see declaration of 'std::bind'
error C2783: 'std::_Binder<std::_Unforced,_Fx,_Types...> std::bind(_Fx &&,_Types &&...)': could not deduce template argument for '_Fx'
note: see declaration of 'std::bind'
Run Code Online (Sandbox Code Playgroud)
此外,IntelliSense抱怨:
cannot determine which instance of overloaded function "boost::asio::io_service::run" is intended
Run Code Online (Sandbox Code Playgroud)
我看到有2个重载boost::asio::io_service::run.但是如何指定使用哪一个?
使用boost::bind代码编译就好了: …
我不太明白std::function实际包含的实例是什么.
通过按值或按引用传递它是否更有效?
以下示例中的性能影响是什么?
通过值:
void printStats(std::function<void(const char *)> printer);
. . .
std::string tmp;
printStats([&tmp](const char * msg){ tmp += msg; });
Run Code Online (Sandbox Code Playgroud)
通过rvalue-reference:
void printStats(std::function<void(const char *)>&& printer);
. . .
std::string tmp;
printStats([&tmp](const char * msg){ tmp += msg; });
Run Code Online (Sandbox Code Playgroud) 考虑以下C++ 11应用程序:
A.cpp:
template<typename T>
struct Shape {
T x;
T area() const { return x*x; }
};
int testA() {
return Shape<int>{2}.area();
}
Run Code Online (Sandbox Code Playgroud)
B.cpp:
template<typename T, typename U = T>
struct Shape {
T x;
U y;
U area() const { return x*y; }
};
int testB() {
return Shape<int,short>{3,4}.area();
}
Run Code Online (Sandbox Code Playgroud)
Main.cpp的:
int testA();
int testB();
int main() {
return testA() + testB();
}
Run Code Online (Sandbox Code Playgroud)
虽然它编译(只要A和B是在单独的TU),它看起来不正确,和我有麻烦弄清楚为什么.
因此,我的问题:这是否违反ODR,超载,或任何其他规则,如果是这样,什么部分标准受到侵犯,为什么?
请考虑带有带有私有构造函数B的类字段的聚合结构的代码A:
class A { A(int){} friend struct B; };
struct B { A a{1}; };
int main()
{
B b; //ok everywhere, not aggregate initialization
//[[maybe_unused]] B x{1}; //error everywhere
[[maybe_unused]] B y{}; //ok in GCC and Clang, error in MSVC
}
Run Code Online (Sandbox Code Playgroud)
我的问题是关于B. 由于初始化是代表调用代码(main此处的函数)进行的,我预计编译器必须拒绝它,因为A的构造函数是私有的。事实上B{1},所有编译器的构造都失败了。
但令我惊讶的B{}是,GCC 和 Clang 都接受了该构造,演示:https : //gcc.godbolt.org/z/7851esv6Y
并且只有 MSVC 拒绝它并显示错误 error C2248: 'A::A': cannot access private member declared in class 'A'。 …
我在Chromium项目中看到了C ++和JSON代码的混合体。
例如在此文件中: config / software_rendering_list_json.cc
这个宏是魔术吗?
#define LONG_STRING_CONST(...) #__VA_ARGS__
Run Code Online (Sandbox Code Playgroud)
如何“字符串化”任意JSON内容?
是否可以在编译期间将动态信息输出到编译器输出?
一个更具体的例子(C++ 11):
static_assert(sizeof(A) == 4, "Wrong size of A");
Run Code Online (Sandbox Code Playgroud)
我想输出sizeof(A)断言失败(或者甚至总是)的值,但是消息中static_assert不能包含任何动态信息.
有没有办法输出sizeof(A)编译器日志的值?