这仅适用于 C++0x。 C++03 没有机会。
编辑:C++0x 的 Consexpr 函数。以下适用于 GCC4.6,但标准并未明确允许它,并且正在考虑对措辞进行小幅调整以使规范允许它。
constexpr bool isequal(char const *one, char const *two) {
*one == *two && (!*one || isEqual(one + 1, two + 1));
}
static_assert(isequal("foo", "foo"), "this should never fail");
static_assert(!isequal("foo", "bar"), "this should never fail");
编译器需要在所有递归过程中跟踪对字符串文字字符的引用。只是没有明确允许对字符的最终读取(如果你眯着眼睛,你可以把它读成被允许的,IMO)。如果你的编译器不想接受上面的简单版本,你可以让你的宏声明数组,然后比较它们
#define CONCAT1(A, B) A ## B
#define CONCAT(A, B) CONCAT1(A, B)
#define CHECK_EQUAL(A, B) \
constexpr char CONCAT(x1, __LINE__)[] = A, \
CONCAT(x2, __LINE__)[] = B; \
static_assert(isequal(CONCAT(x1, __LINE__), CONCAT(x2, __LINE__)), \
"'" A "' and '" B "' are not equal!")
这绝对没问题。
CHECK_EQUAL("foo", "foo"); /* will pass */
CHECK_EQUAL("foo", "bar"); /* will fail */
请注意,CHECK_EQUAL 可以在函数内部使用。 FCD 确实进行了更改,以允许 constexpr 函数在其调用替换中从自动数组中读取。见DR1197。