这是合法的C++吗?
struct foo
{
int a[100];
int b[sizeof(a) / sizeof(a[0])];
};
Run Code Online (Sandbox Code Playgroud)
GCC 4.6接受它,但MSVC 2012没有.看起来它对我来说应该没问题,但谷歌搜索没有帮助,我不知道在标准中的哪个位置.
MSVC 2012提供以下输出:
error C2327: 'foo::a' : is not a type name, static, or enumerator
error C2065: 'a' : undeclared identifier
error C2070: ''unknown-type'': illegal sizeof operand
warning C4200: nonstandard extension used : zero-sized array in struct/union
Run Code Online (Sandbox Code Playgroud) 我或多或少是Java程序员,所以这可能是一个愚蠢的问题,但我找不到任何简单的解决方案.
我在C++中有这样的类:
template<class T> class Node {...}
Run Code Online (Sandbox Code Playgroud)
我需要T才能具有可比性 - 至少要定义== <>运算符.有没有简单的方法来做到这一点 - 或者最佳做法是什么?在Java中,它将是这样的:
public class Node<T extends Comparable> { ... }
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
在Sutter在1:15:26的演讲中,它呈现了如下代码,
class employee{
std::string name_;
public:
template<class String, class=
std::enable_if_t< !std::is_same<std::decay_t<String>, std::string>::value > >
void set_name(String && name)
noexcept(std::isnothrow_assignable<std::string &, String>::value)
{
name_ = std::forward<String>(name);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道std::forward
如果name
是左值,name_
将如何工作,将得到复制构造; 如果name
是右值,name_
将构造移动.但是在幻灯片中它还说Optimized to steal from rvalues (and more)
,还有什么呢?
后来它表明这个代码似乎是所有四个实现中最快的,特别是因为char *
,任何人都有耐心去理解这些代码并解释什么是更优化以及为什么它是最快的,特别是在这种情况下char *
?
假设我想用来std::conditional
确定一个类型,如果类型是一个vector<...>
返回将是a vector<...>::size_type
,如果不是,它将是int
.(只是一个例子).
一种天真的使用方式std::conditional
:
template<class V> struct is_vector : std::false_type{};
template<class T> struct is_vector<std::vector<T>> : std::true_type{};
template<class C>
using my_size_type = typename std::conditional<
not is_vector<C>::value,
int,
C::size_type // note that this line only makes sense when condition is false
>::type;
Run Code Online (Sandbox Code Playgroud)
但是这会失败,因为如果C
是a double
,double::size_type
则会给出错误,即使那是第二个错误选项的评估.
所以,我很想知道是否存在一种lazy_conditional
未评估错误(或第二个错误)语句的情况.
我在这里找到了一些东西:https://stackoverflow.com/a/5317659/225186但我不知道如何使用它我的例子.
请注意,我知道如何在不使用的情况下获得相同的结果std::conditional
:
template<class V> struct my_size_type{typedef int type;};
template<class T> struct my_size_type<std::vector<T>>{typedef std::vector<T>::size_type type;};
Run Code Online (Sandbox Code Playgroud)
问题是,是否存在lazy_conditional …
通过使用Expression SFINAE,您可以检测是否支持某些操作员或操作.
例如,
template <class T>
auto f(T& t, size_t n) -> decltype(t.reserve(n), void())
{ t.reserve(n); }
Run Code Online (Sandbox Code Playgroud)
我的问题是t.reserve(n)
内部decltype
被执行与否?
如果是,这是否意味着t.reserve(n)
执行了两次,一次在内部decltype
,另一次在函数体内?
如果没有,是否只是在编译期间检查验证?但是为什么它没有被执行,我认为逗号分隔表达式列表中的所有表达式都将被执行.