在下面的代码中,我定义了一个简单的log函数.在main我尽量不称呼它; 我打电话std::log.然而,我自己log被称为; 我看到"日志!" 在屏幕上.有谁知道为什么?我使用G ++ 4.7和clang ++ 3.2.
#include <iostream>
#include <cmath>
double log(const double x) { std::cout << "log!\n"; return x; }
int main(int argc, char *argv[])
{
std::log(3.14);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在C++ 11中,模板中static_assert的操作是否应该取决于该模板是否已经实例化?例如,使用以下代码
template <int I>
void sa() { static_assert(0,"Hello."); }
int main(int argc, char *argv[]) { return 0; }
Run Code Online (Sandbox Code Playgroud)
GCC 4.5.0将无法断言,并生成"Hello".信息.另一方面,Digital Mars Compiler版本8.42n没有给出任何消息.
如果我定义了一个struct模板Bar,它接受一个模板参数:
template <template <int,bool,char> class>
struct Bar {};
Run Code Online (Sandbox Code Playgroud)
我可以使用以下struct模板对其进行实例化Zod:
template <int,bool,char> struct Zod {};
Bar<Zod> a;
Run Code Online (Sandbox Code Playgroud)
我也可以使用嵌套struct模板来实例化它,例如JKL:
struct GHI {
template <int,bool,char>
struct JKL {};
};
Bar <GHI::JKL> b;
Run Code Online (Sandbox Code Playgroud)
为什么我不能Bar使用嵌套的可变参数struct模板实例化,例如DEF?:
template <typename ...Ts>
struct ABC {
template <Ts ...>
struct DEF {};
};
Bar<ABC<int,bool,char>::DEF> c;
Run Code Online (Sandbox Code Playgroud)
G ++ 4.9.2抱怨类型/值不匹配; 而Clang 3.4.2的错误报告模板模板参数具有与其对应的模板模板参数不同的模板参数.
是否有可能根据C++ 11中的C++ 11表达式是否为常量表达式(即constexpr)生成编译时布尔值?关于SO的几个问题与此有关,但我在任何地方都没有看到直接答案.
如果我使用lstlisting的内联版本,如下所示:
\lstinline{!$omp parallel for}
Run Code Online (Sandbox Code Playgroud)
vim中的语法高亮显示错误,并且乳胶文件的其余部分显示为红色,就好像它是代码清单的所有部分一样.这是$造成问题的美元.我怎么能避免这个?
多个类模板特化是否有效,当每个模板特化仅在涉及非推导上下文中的模板参数的模式之间不同时?
一个常见的例子是std::void_t使用它来定义一个特征,它揭示了一个类型是否有一个typedef名为"type" 的成员.这里采用单一专业化.这可以扩展到鉴定说类型是否有任何成员typedef被称为"TYPE1",或者一个名为"2型".下面的C++ 1z代码用GCC编译,但不是Clang.这合法吗?
template <class, class = std::void_t<>>
struct has_members : std::false_type {};
template <class T>
struct has_members<T, std::void_t<typename T::type1>> : std::true_type {};
template <class T>
struct has_members<T, std::void_t<typename T::type2>> : std::true_type {};
Run Code Online (Sandbox Code Playgroud) c++ partial-specialization sfinae template-specialization c++17
在Rvalue References简介中,forward定义如下:
template <typename T>
struct identity { typedef T type; };
template <typename T>
T &&forward(typename identity<T>::type &&a) { return a; }
Run Code Online (Sandbox Code Playgroud)
identity班级的目的是什么?为什么不:
template <typename T>
T &&forward(T &&a) { return a; }
Run Code Online (Sandbox Code Playgroud) 我可以在Haskell中定义一个自然变换:
h :: [a] -> Maybe a
h [] = Nothing
h (x:_) = Just x
Run Code Online (Sandbox Code Playgroud)
并且具有函数k:
k :: Char -> Int
k = ord
Run Code Online (Sandbox Code Playgroud)
由于以下事实,满足了自然条件:
h . fmap k == fmap k . h
可以join用类似的方式证明List monad 函数的自然条件吗?我有一些麻烦了解如何join,说concat特别,是一个自然的转变.
我总是喜欢以下关于monad相对于仿函数的力量的直观解释:monad可以改变形状; 算子不能.
例如:length $ fmap f [1,2,3]总是等于3.
然而,使用monad length $ [1,2,3] >>= g通常不会相等3.例如,if g定义为:
g :: (Num a) => a -> [a]
g x = if x==2 then [] else [x]
Run Code Online (Sandbox Code Playgroud)
那就[1,2,3] >>= g等于[1,3].
麻烦我的东西,是类型签名g.似乎不可能定义一个改变输入形状的函数,具有通用的monadic类型,例如:
h :: (Monad m, Num a) => a -> m a
Run Code Online (Sandbox Code Playgroud)
MonadPlus或MonadZero类型具有相关的零元素,而不是使用[],但现在我们拥有的不仅仅是monad.
我对么?如果是这样,有没有办法向Haskell的新人表达这种微妙之处.我想让我心爱的"monad可以改变形状"这句话,只需要更加诚实; 如果需要的话.
任何人都可以告诉我为什么我应该在函数头中指定C数组参数的大小?例如:
void foo (int iz[6]) { iz[42] = 43; }
Run Code Online (Sandbox Code Playgroud)
附:
int is[2] = {1,2,3};
Run Code Online (Sandbox Code Playgroud)
我们得到一个有用的错误.也许它有助于评论/文档?
c++ ×5
c++11 ×4
haskell ×2
monads ×2
arrays ×1
c ×1
c++17 ×1
compile-time ×1
constexpr ×1
latex ×1
lstlisting ×1
namespaces ×1
overloading ×1
sfinae ×1
templates ×1
vim ×1